12

次のコードをうまく動作させるのに問題があります。3 つのフラグメントを持つ がありviewpager、検索アイコンを 1 つだけに表示したいと考えています。最初にフラグメントによる検索機能を追加しようとしましたが、そのページにスワイプするとメニュー項目のレンダリングが遅くなりました。私は現在、検索アイコンをアクティビティに追加し、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 に答える
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()ビューページャーgetCurrentItem()( のようなものviewPager.getCurrentItem()) を呼び出しinvalidateOptionsMenu()、 で作成した customMenu 参照を使用して、そのページで必要なメニューを呼び出して膨張させますonCreateOptionsMenu()

于 2020-06-28T04:34:56.493 に答える