我的活动只包含一个片段容器,我将在其中移动不同的片段。我希望操作栏根据当前片段显示不同的操作图标。例如,当片段 1 处于活动状态时,我希望操作栏显示导航下拉列表,当片段 2 处于活动状态时,我希望操作栏不显示任何内容。
我的问题是:
1) 更换片段时更新操作栏的正确事件是什么?
2)当片段 2 变为活动状态时,如何将操作栏恢复到初始状态(删除导航下拉列表,也许还有其他东西)?
我的活动只包含一个片段容器,我将在其中移动不同的片段。我希望操作栏根据当前片段显示不同的操作图标。例如,当片段 1 处于活动状态时,我希望操作栏显示导航下拉列表,当片段 2 处于活动状态时,我希望操作栏不显示任何内容。
我的问题是:
1) 更换片段时更新操作栏的正确事件是什么?
2)当片段 2 变为活动状态时,如何将操作栏恢复到初始状态(删除导航下拉列表,也许还有其他东西)?
1)在您的活动中存储对菜单的引用。在您的活动中创建私有属性:
private Menu mMenu;
2)获取对菜单的引用onCreateOptionsMenu
:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.test_choice, menu);
mMenu = menu;
return super.onCreateOptionsMenu(menu);
}
3)然后,您可以在需要时切换更改操作栏中的项目,例如,我创建了该方法来更改操作栏项目的图标和标题:
private void displayActionBar() {
if (mMenu == null) return;
if (mQuestionStage) {
MenuItem nextItem = mMenu.findItem(R.id.action_testNext);
nextItem.setIcon(R.drawable.navigation_accept);
nextItem.setTitle(getResources().getString(R.string.action_testCheck));
} else
{
MenuItem nextItem = mMenu.findItem(R.id.action_testNext);
nextItem.setIcon(R.drawable.navigation_forward);
nextItem.setTitle(getResources().getString(R.string.action_testNext));
}
}
编辑
根据其他评论,您可以在操作栏中切换下拉菜单(在显示和不显示之间)。您可以在需要的地方使用该代码:
ActionBar actionBar = getSupportActionBar();
if (actionBar.getNavigationMode() == ActionBar.NAVIGATION_MODE_LIST)
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
else
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
我会建议您将 ActionBar 与 Fragment 的生命周期一起处理,而不是在没有 Fragment 切换的情况下更改它(这可能会导致用户混淆)。
在您片段的onCreate()
方法中,通过 通知您要更改操作栏的活动setHasOptionsMenu(true)
。onCreateOptionsMenu()
如果没有此语句,即使您覆盖它,您的片段也不会被调用。
onCreateOptionsMenu()
通过覆盖和处理onOptionsItemSelected()
方法中的响应来更改操作栏,所有这些都在片段中。(顺便说一句,如果您不处理项目点击,请记住致电super.onOptionsItemSelected()
)
onBackStackChanged()
当按下返回键并使用返回堆栈时,请记住覆盖该方法或使用其他方式正确处理 UI(例如,操作栏)。有关详细信息,请参阅此 android 的开发指南文章。
附言。如果您只是想删除特定片段中先前片段的操作栏项目,只需menu.clear()
在其中调用onCreateOptionsMenu()