更新操作栏的正确事件是什么?

时间:2013-09-22 02:21:56

标签: android

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

我的问题是:

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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

  2. 通过覆盖onCreateOptionsMenu()来更改操作栏,并使用onOptionsItemSelected()方法处理响应,所有碎片。 (顺便说一句,如果您没有处理项目点击,请记得致电super.onOptionsItemSelected()

  3. 当按下后退键并使用后台堆栈时,请记住覆盖onBackStackChanged()方法或使用其他方法正确处理UI(例如,操作栏)。有关详细信息,请参阅this android's develop guide article

  4. PS。如果您只是想删除特定片段中的先前片段的操作栏项,只需在menu.clear()

    中调用onCreateOptionsMenu()