Android 如何在ViewPager中的页面之间切换时禁用菜单选项?

Android 如何在ViewPager中的页面之间切换时禁用菜单选项?,android,Android,在页面之间转换时,每个片段页面共享相同的菜单选项。菜单选项包含启动活动的按钮。该活动高度依赖于当前页面项显示的信息 我注意到,当我更改视图时,下一页几乎显示在屏幕上(未完全转换),并且我为该项选择了选项,这些选项显示了来自上一项的数据。我想这是因为,他在页面之间的转换并没有完全完成。这对我的用户来说有点混乱。可能有人刷得更快,然后按下选项按钮。我注意到在片段之间滑动时,突然按下菜单选项。这些选项显示以前活动页面中的数据 如果我只能隐藏菜单选项,并且只能在页面完全转换时显示,我相信我可以解决这个问

在页面之间转换时,每个片段页面共享相同的菜单选项。菜单选项包含启动活动的按钮。该活动高度依赖于当前页面项显示的信息

我注意到,当我更改视图时,下一页几乎显示在屏幕上(未完全转换),并且我为该项选择了选项,这些选项显示了来自上一项的数据。我想这是因为,他在页面之间的转换并没有完全完成。这对我的用户来说有点混乱。可能有人刷得更快,然后按下选项按钮。我注意到在片段之间滑动时,突然按下菜单选项。这些选项显示以前活动页面中的数据

如果我只能隐藏菜单选项,并且只能在页面完全转换时显示,我相信我可以解决这个问题。或者,也许我做错了什么,本来可以避免这一切的

我用的是FragmentStatePagerAdapter


谢谢大家!

使用并在触发事件时检查滚动条的状态。如果滚动条处于空闲状态,则页面处于查看和活动状态(允许用户按下菜单按钮),如果处于另一种状态,则锁定/隐藏菜单按钮。

使用并在触发事件时检查滚动的状态如果处于空闲状态,则页面处于查看和活动状态(允许用户按下菜单按钮),如果处于另一种状态,则锁定/隐藏菜单按钮。

单击按钮时检查ViewPagers当前项目-


单击按钮时,检查ViewPagers当前项目-


我想我能解决我的问题。我在我的片段上创建了一个接口,托管活动必须实现该接口:

public interface OnOptionsMenuEnabledListener{ public boolean onOptionsMenuEnabledListener(); }
宿主活动将只返回一个标志,指示菜单是否已启用

@Override
public boolean onOptionsMenuEnabledListener()
{
    return mOptionsEnabled;
}
并通过
ViewPager.onPageScrollStateChanged(int-state)
设置标志:

每次在屏幕转换期间选择该选项时,我都会调用接口方法来向我传达标志的状态:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    boolean enable = true;

    if(mOnOptionsMenuEnabledListener != null)
    {
        enable = mOnOptionsMenuEnabledListener.onOptionsMenuEnabledListener();
    }

    if(enable)
    {
      ...
      // select your menu items
    }
    return true;
}
因此,在这种方法中,菜单仍然存在(这是一个很大的优点)。但选项菜单只有在特定页面上稳定下来后才会做出反应

有了这个,我再也不会遇到这个问题了

我希望这对将来的人有所帮助!
干杯

我想我能解决我的问题。我在我的片段上创建了一个接口,托管活动必须实现该接口:

public interface OnOptionsMenuEnabledListener{ public boolean onOptionsMenuEnabledListener(); }
宿主活动将只返回一个标志,指示菜单是否已启用

@Override
public boolean onOptionsMenuEnabledListener()
{
    return mOptionsEnabled;
}
并通过
ViewPager.onPageScrollStateChanged(int-state)
设置标志:

每次在屏幕转换期间选择该选项时,我都会调用接口方法来向我传达标志的状态:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    boolean enable = true;

    if(mOnOptionsMenuEnabledListener != null)
    {
        enable = mOnOptionsMenuEnabledListener.onOptionsMenuEnabledListener();
    }

    if(enable)
    {
      ...
      // select your menu items
    }
    return true;
}
因此,在这种方法中,菜单仍然存在(这是一个很大的优点)。但选项菜单只有在特定页面上稳定下来后才会做出反应

有了这个,我再也不会遇到这个问题了

我希望这对将来的人有所帮助!
干杯

我已经在使用我定制的FragmentStatePagerAdapter了。我不能从那里重写那个方法。我正在寻找替代方案如果您有一个与FragmentStatePagerAdapter关联的ViewPager,您应该使用ViewPager
setOnPageChangeListener
来设置该侦听器,您不需要更改FragmentStatePagerAdapter我已经在使用我定制的FragmentStatePagerAdapter了。我不能从那里重写那个方法。我正在寻找替代方案如果您有一个与FragmentStatePagerAdapter关联的ViewPager,您应该使用ViewPager
setOnPageChangeListener
来设置该侦听器,您不需要更改FragmentStatePagerAdapter我不太确定这将如何解决我的问题?获取当前项目的意义是什么?这是相当稀疏的。非常抱歉。当您单击按钮时,您希望从viewpager中最后一次看到的项目中获取信息。我相信您已经给了pageAdapter一些列表,所以现在当用户单击按钮时,您正在查询您给ViewPager的列表以及最后看到的位置。谢谢!但我想我更倾向于竖起旗帜。正如前面的用户所建议的。但我一定会尝试你的建议。现在,对于我来说,试图检测之前选择的内容对我来说有点太多的代码,这将使我面临过度设计片段和活动的风险。将布局、适配器和适配器创建添加到问题中,我将向你展示如何用你的代码实现这一点我不太确定这将如何解决我的问题?获取当前项目的意义是什么?这是相当稀疏的。非常抱歉。当您单击按钮时,您希望从viewpager中最后一次看到的项目中获取信息。我相信您已经给了pageAdapter一些列表,所以现在当用户单击按钮时,您正在查询您给ViewPager的列表以及最后看到的位置。谢谢!但我想我更倾向于竖起旗帜。正如前面的用户所建议的。但我一定会尝试你的建议。现在,对于我来说,试图检测之前选择的内容对我来说是有点太多的代码,这将使我面临过度设计片段和活动的风险。将布局、适配器和适配器创建添加到问题中,我将向你展示如何用代码实现这一点