即使未显示,菜单抽屉片段也会使菜单膨胀

时间:2014-09-27 22:54:36

标签: java android android-fragments

必须有一些基本的东西,我还没有完全理解片段管理。

这是我应用的当前架构:

  • 我们有一个使用Eclipse(MenuActivity.java
  • 中提供的模板生成的菜单活动
  • 菜单中显示的每个片段都有两个布局。一个用于电话,另一个用于平板电脑这些布局仅包含FrameLayout,使用FragmentManager/Transaction替换为片段。
  • 每个片段实现onCreateOptionsMenu以添加它们自己的菜单位。

问题在于,当我使用抽屉菜单切换标签时,某些选项会保留在操作栏中。此外,接收对onOptionsItemSelected的调用的片段始终是所选的最后一个片段。

MainActivity.java

的部分代码
@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getFragmentManager();
    Fragment fragment = null;
    String tag = "";

    switch(position) {
    case 0:
        tag = "tours_main_fragment";

        fragment = new ToursMainFragment();
        mTitle = getString(R.string.title_section1);

        break;

    case 1:
        tag = "motos_main_fragment";

        fragment = new MotoMainFragment();
        mTitle = getString(R.string.title_section2);

        break;

    }

    if(fragment != null) {
        fragmentManager
                .beginTransaction()
                .replace(R.id.container, fragment, tag)
                .commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {     
    if (!mNavigationDrawerFragment.isDrawerOpen()) {
        // Only show items in the action bar relevant to this screen
        // if the drawer is not showing. Otherwise, let the drawer
        // decide what to show in the action bar.
        getMenuInflater().inflate(R.menu.menu, menu);

        restoreActionBar();
        return false;
    }
    return super.onCreateOptionsMenu(menu);
}

1 个答案:

答案 0 :(得分:1)

我认为您正在使用DrawerLayout进行导航,并使用基于导航抽屉中所选项目的相应片段替换主Activity布局中的片段容器。

打开/关闭抽屉时,您可能希望使选项菜单无效。如活动API中所述:

  

public void invalidateOptionsMenu()

     

在API级别11中添加   声明选项菜单已更改,因此应重新创建。 onCreateOptionsMenu(Menu)>方法将在下次需要显示时调用。

所以在切换抽屉时调用它应该有助于根据片段重新创建菜单选项。示例代码:

  mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_navigation_drawer, R.string.drawer_open, R.string.drawer_close) {

            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                getSupportActionBar().setTitle(mTitle);
                supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                getSupportActionBar().setTitle(mDrawerTitle);
                supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
相关问题