2014-09-27 42 views
0

必须有一些基本的东西,我并不完全了解碎片管理。菜单抽屉碎片即使未显示,也会膨胀其菜单

这里是我的应用程序的当前体系结构:

  • 我们已经使用在Eclipse(MenuActivity.java
  • 从菜单中显示的每个片段都有两个布局提供的模板生成一个菜单的活动。一个是手机,另一个是平板电脑。这些布局仅包含使用FragmentManager/Transaction替换为碎片的FrameLayout
  • 每个片段实现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

某些代码我收集您使用DrawerLayout用于导航和与基于在导航抽屉中选择的项目的相应片段的主要活动布局替换片段容器。

当抽屉打开/关闭时,您可能想使选项菜单无效。作为活动API中指出:在API层面

公共无效invalidateOptionsMenu()

添加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() 
      } 
+0

你是对的片段交易。问题在于片段事务发生时菜单不会被清除。 – Becojo 2014-09-27 23:45:05