1

我的活动只包含一个片段容器,我将在其中移动不同的片段。我希望操作栏根据当前片段显示不同的操作图标。例如,当片段 1 处于活动状态时,我希望操作栏显示导航下拉列表,当片段 2 处于活动状态时,我希望操作栏不显示任何内容。

我的问题是:

1) 更换片段时更新操作栏的正确事件是什么?

2)当片段 2 变为活动状态时,如何将操作栏恢复到初始状态(删除导航下拉列表,也许还有其他东西)?

4

2 回答 2

0

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);
于 2013-09-22T02:36:01.667 回答
0

我会建议您将 ActionBar 与 Fragment 的生命周期一起处理,而不是在没有 Fragment 切换的情况下更改它(这可能会导致用户混淆)。

  1. 在您片段的onCreate()方法中,通过 通知您要更改操作栏的活动setHasOptionsMenu(true)onCreateOptionsMenu()如果没有此语句,即使您覆盖它,您的片段也不会被调用。

  2. onCreateOptionsMenu()通过覆盖和处理onOptionsItemSelected()方法中的响应来更改操作栏,所有这些都在片段中。(顺便说一句,如果您不处理项目点击,请记住致电super.onOptionsItemSelected()

  3. onBackStackChanged()当按下返回键并使用返回堆栈时,请记住覆盖该方法或使用其他方式正确处理 UI(例如,操作栏)。有关详细信息,请参阅此 android 的开发指南文章

附言。如果您只是想删除特定片段中先前片段的操作栏项目,只需menu.clear()在其中调用onCreateOptionsMenu()

于 2013-09-22T03:04:01.713 回答