Viewpager中的Fragments的OptionsMenu显示了彼此的按钮

时间:2014-09-22 01:57:21

标签: android android-fragments android-actionbar android-optionsmenu

我在一个viewpager中有三个片段。

其中两个片段有自己版本的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"

就像我打开Activity一样,所有三个按钮都出现了。 然而,当我滚动它们时,错误的那些神奇地消失了。 感觉活动是在活动创建时调用每个Fragment的选项菜单,然后在我向左和向右滑动时适当地更改菜单。 我检查了菜单,但不确定是什么错。 您认为我需要检查的任何事情?我有点想法。

谢谢!

3 个答案:

答案 0 :(得分:16)

ViewPager OnPageChangeListener中,将适配器设置为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()方法的调用,只有当前可见的片段才会收到并能够填充选项菜单。

答案 1 :(得分:0)

我已经习惯了这个,它对我有用:

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

}

答案 2 :(得分:0)

npm i jspdf --save不推荐使用OnPageChangeListener

所以尝试使用

addOnChangeListener