我知道类似的问题已经在这个网站上发布了很多次,然而,我的问题不是我如何在不同的片段中显示/隐藏菜单项。我记下来了。问题是在滑动片段和显示或隐藏新菜单项之间存在延迟。这种延迟确实降低了接口的性能。操作栏菜单项的更改应该是即时的,除了其他原因外,还应该避免点击错误片段中的某些菜单项。
所以问题是,我怎么能改变菜单项在行动栏立即当用户开始滑动片段去下一个?
我知道这是可能的,因为各种应用程序已经这样做了。我目前在每个片段中重写onPrepareOptionsMenu()方法,并告诉它哪些项目要显示,哪些要隐藏。我使用了supportInvalidateOptionsMenu()方法来提示菜单项的更改,但是延迟仍然太长而且明显
我愿意改变片段中菜单项的结构/技术,以便在滑动开始时立即改变菜单时间。
请帮助。谢谢!
好的,所以在到处看了之后,发现其他人的类似帖子没有真正的答案,我终于想出了如何在页面被滑动时使操作栏菜单无效。你想在activity的onCreate方法中的onPageChangeListener中这样做,如下所示:
yourViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()
{
@Override
public void onPageSelected(int position)
{
//Clear action bar menu items.
//This prompts the onPrepareOptionsMenu which recreates the menu with
//with the appropriate options for a given fragment as defined by you
supportInvalidateOptionsMenu();
}
@Override
public void onPageScrollStateChanged (int arg0)
{
//Clear action bar menu items and display correct ones
//This invalidates the menu options as soon as the swiping of pages begins
supportInvalidateOptionsMenu();
}
}
所以onPageScrollStateChanged方法是你真正想要的,当你想要页面滑动触发一个指定的动作
这个问题的一个可能的解决方案是将您的自定义菜单膨胀到活动宿主的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;
}
}