【问题标题】:Android: Showing Action Bar menu items depending on ViewPagerAndroid:根据 ViewPager 显示操作栏菜单项
【发布时间】:2012-11-05 10:09:59
【问题描述】:

我无法运行以下代码。我有一个带有 3 个片段的 viewpager,我希望一个搜索图标只显示在一个片段上。我开始尝试通过片段添加搜索功能,但是滑动到该页面时菜单项的呈现速度很慢。我现在正在将搜索图标添加到活动中,然后根据活动的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  

谁能告诉我为什么会发生这种情况?

【问题讨论】:

    标签: android android-actionbar android-viewpager


    【解决方案1】:

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

    【讨论】:

    • 感谢您的快速回复!这确实可以正常工作。但是,从我滑动到页面和菜单项的呈现之间仍然有一点延迟。我将继续研究现有的 Google 应用程序,因为它们似乎可以立即呈现。
    • 如果你使用支持库,那么它的supportInvalidateOptionsMenu()
    • 我找不到 getCurrentPage() 方法,它是用户定义的还是 Android 本身的?
    【解决方案2】:

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

    【讨论】:

    • 我这样做了,它适用于某些设备;但在其他设备上,它仅在您转到下一页并返回时才起作用(第一次不起作用)
    • 这很奇怪...感觉这些设备的具体实现中存在错误...该死的制造商...
    【解决方案3】:

    这个问题的一个可能的解决方案是在你的 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;
            }
         }
    

    【讨论】:

      【解决方案4】:

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

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

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

      然后,在onPrepareOptionsMenu() 中,我调用viewpager getCurrentItem()(应该类似于viewPager.getCurrentItem()),调用invalidateOptionsMenu() 并使用我在onCreateOptionsMenu() 中创建的customMenu 引用在该页面中扩展我想要的任何菜单.

      【讨论】:

        猜你喜欢
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        相关资源
        最近更新 更多