在Fragment中检测ViewPager选项卡的更改

65

我有一个带多个片段的ViewPager。在一个Fragment中,我播放音频。当我滑动到另一个片段时,我想停止音频播放。如何检测在ViewPager中另一个片段现在可见?

我尝试了覆盖onStoponHiddenChanged方法。但没有成功。一定有一种方法可以覆盖 "您不再活跃" 的方法。对吧?

1个回答

140

我进行了一些调查,发现ViewPager会调用setUserVisibleHintsetMenuVisibility两个方法。根据setUserVisibleHint的文档,我建议重写setUserVisibleHint方法:

向系统设置一个提示,指示该片段的UI当前是否对用户可见。此提示默认为true,并在片段实例状态保存和恢复期间保持不变。应用程序可以将此设置为false,以指示片段的UI已滚动到视野之外或以其他方式未直接对用户可见。这可能被系统用于优先处理诸如片段生命周期更新或加载器排序行为之类的操作。

请尝试将以下代码放入您的片段中:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    // Make sure that we are currently visible
    if (this.isVisible()) {
        // If we are becoming invisible, then...
        if (!isVisibleToUser) {
            Log.d("MyFragment", "Not visible anymore.  Stopping audio.");
            // TODO stop audio playback
        }
    }
}

3
在我的情况下,从未调用过setUserVisibleHint方法。 - Wayne
1
Wayne: 根据我的经验,我发现如果ViewPager的适配器是FragmentPagerAdapter,则会调用setUserVisibleHint方法,但如果适配器是FragmentStatePagerAdapter,则不会调用。因此,如果您遇到问题,请尝试确保使用FragmentPagerAdapter。 - louielouie
5
若要在低版本API中使用Fragment的setUserVisibleHint方法,可以使用Android Support库。例如,API级别为4可通过http://developer.android.com/reference/android/support/v4/app/Fragment.html#setUserVisibleHint(boolean)获得该方法。 - louielouie
2
功能很好,但在方向更改后不会再次调用。因此提示未恢复,但片段已恢复。我该如何实现回忆? - Louis
3
这并不可靠,有时会自动调用。我找到了一个更好的替代方案:https://dev59.com/AF8e5IYBdhLWcg3whqo4#25822814 - Rohan Kandwal
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接