Android: отображение пунктов меню панели действий в зависимости от ViewPager
У меня возникли проблемы с получением следующего кода. У меня есть 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
Может ли кто-нибудь дать мне некоторое представление о том, почему это может происходить?
Ответы
Ответ 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();
}
Ответ 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;
}
}