我知道之前已经多次在此网站上发布过类似的问题,但我的问题不是如何在不同的片段中显示/隐藏菜单项。我明白了。问题是刷卡片段与显示或隐藏的新菜单项之间存在延迟。这种延迟确实会减损界面。除其他原因外,操作栏菜单项中的更改应立即避免单击错误片段中的某些菜单项。
所以问题是,当用户开始滑动片段以转到下一个片段时,如何立即更改操作栏中的菜单项?
我知道这是可能的,因为各种应用程序已经这样做了。 我目前正在覆盖每个片段中的onPrepareOptionsMenu()方法,并告诉它要显示哪些项目以及要隐藏哪些项目。我使用supportInvalidateOptionsMenu()方法来提示更改菜单项,但是滞后时间太长且显而易见。
我愿意更改片段中更改菜单项的结构/技术,以便在刷卡开始时立即更改菜单时间。
请帮忙。谢谢!
答案 0 :(得分:7)
好的,所以在到处寻找,并找到其他人没有真正答案的类似帖子后,我终于想出了如何在刷页后立即使操作栏菜单无效。您希望在活动的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方法就是您真正想要的。
答案 1 :(得分:0)
此问题的一个可能解决方案是在您的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;
}
}