12

我无法解决以下代码。我有一个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

4 回答 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();
}
于 2012-11-05T10:15:35.073 回答
4

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

于 2013-09-22T13:03:09.527 回答
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;
        }
     }
于 2016-09-10T23:42:08.097 回答
0

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

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

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

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

于 2020-06-28T04:34:56.493 回答