在viewPager片段中显示/隐藏菜单项没有延迟(Android)

时间:2014-07-08 00:11:46

标签: android android-fragments android-actionbar android-support-library android-menu

我知道之前已经多次在此网站上发布过类似的问题,但我的问题不是如何在不同的片段中显示/隐藏菜单项。我明白了。问题是刷卡片段与显示或隐藏的新菜单项之间存在延迟。这种延迟确实会减损界面。除其他原因外,操作栏菜单项中的更改应立即避免单击错误片段中的某些菜单项。

所以问题是,当用户开始滑动片段以转到下一个片段时,如何立即更改操作栏中的菜单项?

我知道这是可能的,因为各种应用程序已经这样做了。 我目前正在覆盖每个片段中的onPrepareOptionsMenu()方法,并告诉它要显示哪些项目以及要隐藏哪些项目。我使用supportInvalidateOptionsMenu()方法来提示更改菜单项,但是滞后时间太长且显而易见。

我愿意更改片段中更改菜单项的结构/技术,以便在刷卡开始时立即更改菜单时间。

请帮忙。谢谢!

2 个答案:

答案 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;
        }
     }