我无法获得以下代码来解决问题。我有一个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
任何人都可以告诉我为什么会发生这种情况吗?
答案 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引用。