Android:根据ViewPager显示操作栏菜单项

时间:2012-11-05 10:09:59

标签: android android-actionbar android-viewpager

我无法获得以下代码来解决问题。我有一个viewpager有3个片段,我希望搜索图标只显示在一个上。我开始尝试通过片段添加搜索功能,但是当滑动到该页面时,菜单项的呈现速度很慢。我现在要将搜索图标添加到活动中,然后根据哪个viewpager页面处于活动状态隐藏或显示,但以下内容无效:

public class MyApp extends FragmentActivity implements 
   FragmentTeams.FragmentNotification,ViewPager.OnPageChangeListener, 
      OnNavigationListener{

  ...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);

    menuSearch = menu.findItem(R.id.menu_search);
    mSearchView = new SearchView(this);
    menuSearch.setActionView(mSearchView);
    menuSearch.setVisible(false);
    return true;
}

 @Override
public void onPageSelected(int pageNum) {

if(pageNum== 1){     
    ActionBar actionBar = MyApp.this.getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);     
        menuSearch.setVisible(true);
        invalidateOptionsMenu();

}else{           
    ActionBar actionBar = MyApp.this.getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);  
        menuSearch.setVisible(false);
        invalidateOptionsMenu();
    }
}

虽然以上(似乎)在onCreateOptionsMenu处创建并隐藏了图标,但在移至

时不会重新启用该图标
 pageNum ==1  

任何人都可以告诉我为什么会发生这种情况吗?

4 个答案:

答案 0 :(得分:22)

invalidateOptionsMenu使系统调用方法onPrepareOptionsMenu,因此您可以按如下方式覆盖此方法:

public boolean onPrepareOptionsMenu(Menu menu) {
      int pageNum = getCurrentPage();
      if (pageNum == 1) {
         menu.findItem(R.id.menu_search).setVisible(true);

      }
      else {
         menu.findItem(R.id.menu_search).setVisible(false);
      }
   }

public void onPageSelected(int pageNum) {
    invalidateOptionsMenu();
}

答案 1 :(得分:4)

您可以在片段中实现onCreateOptionsMenu()并为片段设置'setHasOptionsMenu(true)'

答案 2 :(得分:0)

此问题的一个可能解决方案是在您的ViewPager活动内部夸大自定义菜单并获取菜单参考,如下所示:

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     getMenuInflater().inflate(R.menu.custom_menu, menu);
     customMenu = menu;
     return super.onCreateOptionsMenu(menu);
 }

之后,您可以轻松隐藏/显示菜单项,而不会在onPageSelected方法中显示如下:

 @Override
 public void onPageSelected(int position) {
  switch (position) {
        case 0: { 
           customMenu.getItem(0).setVisible(false);
           break;
        }
       case 1: { 
           customMenu.getItem(0).setVisible(true);
             break;
        }
     }

答案 3 :(得分:0)

我使用了Nermeen的答案,并设法毫不拖延地得到了答案。

我没有在onCreateOptionsMenu中添加任何内容,但是使用它来引用菜单:

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     customMenu = menu;
     return super.onCreateOptionsMenu(menu);
 }

然后,在onPrepareOptionsMenu()中,我调用viewpager getCurrentItem()(应该类似于viewPager.getCurrentItem()),调用invalidateOptionsMenu(),然后使用我在onCreateOptionsMenu()中创建的customMenu引用。