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

12

我遇到了以下代码问题。 我有一个带有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 方法中创建并隐藏了图标,但当移动到其他位置时该图标不会重新启用。

虽然上述代码似乎在 onCreateOptionsMenu 方法中创建并隐藏了图标,但当移动到其他位置时该图标不会重新启用。

 pageNum ==1  

有人可以给我一些见解,解释为什么会发生这种情况吗?

4个回答

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
感谢您的快速回复!这确实可以正常工作。但是,从我滑动到页面到菜单项渲染仍然有轻微延迟。我将继续研究原装的谷歌应用程序,因为它们似乎能够立即渲染。 - Josh
1
如果您使用支持库,则可以使用 supportInvalidateOptionsMenu() - IronBlossom
1
我找不到getCurrentPage()方法,它是用户定义的还是Android自身的? - Pravinsingh Waghela

4
你可以在Fragment中实现onCreateOptionsMenu()方法并为该fragment设置'setHasOptionsMenu(true)'。

我做了这个,它在一些设备上可以工作;但在其他设备上,只有当你进入下一页并返回时才能工作(第一次不起作用)。 - Roel
这很奇怪...感觉那些设备的具体实现中有漏洞...该死的制造商... - Boy

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;
        }
     }

0

我使用了Nermeen的答案,并成功地在没有任何延迟的情况下得到了它。

我不会在onCreateOptionsMenu中膨胀任何内容,而是使用它来获取菜单的引用:

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

然后,在onPrepareOptionsMenu()中,我调用viewpager的getCurrentItem()(应该是类似于viewPager.getCurrentItem()),调用invalidateOptionsMenu()并使用我在onCreateOptionsMenu()中创建的customMenu引用来填充我想要的菜单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接