Подтвердить что ты не робот

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  

Может ли кто-нибудь дать мне некоторое представление о том, почему это может происходить?

4b9b3361

Ответ 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;
        }
     }