我在一个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的选项菜单,然后在我向左和向右滑动时适当地更改菜单。 我检查了菜单,但不确定是什么错。 您认为我需要检查的任何事情?我有点想法。
谢谢!
答案 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