web-dev-qa-db-ja.com

互いのボタンを表示するViewpagerのフラグメントのOptionsMenu

ビューページャーに3つのフラグメントがあります。

これらのフラグメントのうちの2つには、独自のバージョンのonCreateOptionsMenuメソッドがあります。

 @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);

    // Set up 1 action button
    inflater.inflate(R.menu.home_snapshot_add, menu);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);

    // Set up 2 action buttons
    inflater.inflate(R.menu.home_snapshot_send, menu);
}

ホームアクティビティには、基本的なonCreateOptionsMenuメソッドがあります。

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    return false;
}

OnCreateメソッドでは、各フラグメントがメソッドを呼び出します。

setHasOptionsMenu(true);

各メニュー項目には次のタグが付いています。

Android:showAsAction="always"

アクティビティを開くと、3つのボタンがすべて表示されているようです。しかし、それらをスクロールすると、間違ったものは魔法のように消えます。アクティビティは、アクティビティの作成時にすべてのフラグメントのオプションメニューを呼び出しており、左右にスワイプするとメニューが適切に変更されているように感じます。メニューを確認しましたが、何が問題なのかわかりません。私がチェックする必要があると思うものはありますか?私は少しアイデアがありません。

ありがとう!

15
SalicBlu3

ViewPagerOnPageChangeListenerで、アダプターをViewPagerに設定した後、次のようにします。

_@Override
public void onPageSelected(int position){
   invalidateFragmentMenus(position);
}


private void invalidateFragmentMenus(int position){
   for(int i = 0; i < mViewPagerFragentAdapter.getCount(); i++){
      mViewPagerAdapter.getItem(i).setHasOptionsMenu(i == position);
   }
   invalidateOptionsMenu(); //or respectively its support method.
}
_

フラグメントアダプタを設定した後、次の引数を使用して同じメソッドを呼び出します。

_invalidateFragmentMenus(mViewPager.getCurrentItem());
_

上記のステートメントは、onCreateOptionsMenu()が呼び出されたときに、他のすべてのフラグメントがinvalidateOptionsMenu()メソッドの呼び出しを受け取らないようにします。現在表示されているフラグメントのみが受け取り、オプションメニューにデータを入力できます。

16

私はこれを使用しました、そしてそれは私のために働きました:

//In your Fragment
@Override
public void onResume() {
    super.onResume();
    setHasOptionsMenu(isVisible());

}
0

OnPageChangeListeneraddOnChangeListenerで非推奨になりました。

だから使ってみてください

yourViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
               // do your operation here.
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
0
Sushil Kumar