【问题标题】:Showing/Hiding menu items in viewPager fragments WITHOUT DELAY (Android)在没有延迟的情况下在 viewPager 片段中显示/隐藏菜单项(Android)
【发布时间】:2014-07-08 00:11:46
【问题描述】:

我知道类似的问题已经在这个网站上发布过很多次了,但是,我的问题不是我如何在不同的片段中显示/隐藏菜单项。我把它记下来了。问题是在滑动片段和显示或隐藏新菜单项之间存在延迟。这种延迟确实有损于界面。除其他原因外,操作栏菜单项中的更改应立即进行,以避免单击错误片段中的某些菜单项。

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

我知道这是可能的,因为各种应用程序已经这样做了。 我目前正在覆盖每个片段中的 onPrepareOptionsMenu() 方法,并告诉它要显示哪些项目以及要隐藏哪些项目。我使用 supportInvalidateOptionsMenu() 方法来提示菜单项的变化,但延迟仍然太长且明显。

我愿意改变我在片段中更改菜单项的结构/技术以便在滑动开始后立即更改菜单时间。

请帮忙。谢谢!

【问题讨论】:

  • 请记住,在用户松开手指之前,他们可以“放弃”页面更改,只需反转滑动方向即可。这就是为什么在提交页面更改之前操作栏更改不应生效的原因;否则,如果他们放弃页面更改,他们将拥有错误的项目,因为您更改得太早了。如果您想尝试围绕一些框架来尝试在手指抬起后动画完成时发生这些操作栏更改(可能会为该动画添加卡顿),这可能值得一试.
  • @CommonsWare 你是对的!我曾考虑过这一点,但我在想也许所有菜单项都会在滑动时立即消失,然后在提交更改后立即出现正确的菜单项。我认为这将是一个更好的解决方案。知道如何立即隐藏所有菜单项吗?
  • 好吧,您可以尝试setVisible(false) 隐藏它们,等待完全切换。这可能比完整的操作栏失效更快。

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


【解决方案1】:

好的,所以在到处寻找之后,在没有真正答案的情况下找到其他人的类似帖子后,我终于想出了如何在页面被滑动后立即使操作栏菜单无效。您想在活动的 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 方法是您想要页面滑动触发指定操作时真正想要的方法。

【讨论】:

  • bleh 这仍然对我不起作用。这很丑,但我只是隐藏选项并使用选项卡侦听器设置活动 - 在选择选项卡时显示和隐藏不同的选项。
【解决方案2】:

这个问题的一个可能的解决方案是在你的 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;
        }
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2013-11-24
    • 2019-05-02
    • 2012-12-30
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多