我在 viewpager 中有三个 fragment 。
其中两个 fragment 有它们自己版本的 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);
}
主页 Activity 有一个基本的 onCreateOptionsMenu 方法:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return false;
}
在onCreate方法中,每个 fragment 调用方法:
setHasOptionsMenu(true);
每个菜单项都有标签:
android:showAsAction="always"
似乎当我打开 Activity 时,所有三个按钮都会出现。 但是,当我滚动浏览它们时,错误的会神奇地消失。 感觉就像 Activity 在创建 Activity 时调用每个 Fragment 的选项菜单,然后在我左右滑动时适本地更改菜单。 我检查了菜单,但不确定出了什么问题。 你认为我需要检查什么吗?我有点没主意。
谢谢!
最佳答案
在您的 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.
}
设置 fragment 适配器后,使用以下参数调用相同的方法:
invalidateFragmentMenus(mViewPager.getCurrentItem());
上述语句将防止所有其他 fragment 在 invalidateOptionsMenu()
被调用时不接收对 onCreateOptionsMenu()
方法的调用,只有当前可见的 fragment 将被接收和能够填充选项菜单。
关于android - Viewpager 中 fragment 的 OptionsMenu 显示彼此的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25965750/