如何知道片段何时在 viewpager 中实际可见

Posted

技术标签:

【中文标题】如何知道片段何时在 viewpager 中实际可见【英文标题】:How to know when fragment actually visible in viewpager 【发布时间】:2018-07-31 06:32:59 【问题描述】:

我在 ViewPager 中使用了 4 个片段,因为 ViewPager 会提前加载上一个和下一个片段,并且在片段之间导航时不会调用生命周期方法。 那么有什么方法可以检测 Fragment 何时真正可见。 提前致谢。

【问题讨论】:

请提供一个最小的、完整的和可验证的示例来说明您尝试过的操作。 ***.com/help/mcve 【参考方案1】:

根据@Matt 的回答 setUserVisibleHint 已弃用

所以这是另一种方法。

    @Override
    public void setMenuVisibility(boolean isvisible) 
        super.setMenuVisibility(isvisible);
        if (isvisible)
            Log.d("Viewpager", "fragment is visible ");
        else 
            Log.d("Viewpager", "fragment is not visible ");
        
    

【讨论】:

@JohnGlen 您遇到过哪个问题? 我认为如果 Fragment 可见,则意味着它已在屏幕上呈现。那是我的误解。 @JohnGlen 好的,那么你需要恢复你的反对票 我试过了,但在编辑答案之前它不会让我。 它不适用于 Fragment【参考方案2】:

当然。假设 viewPager 是您的 ViewPager 实例,请使用:viewPager.getCurrentItem()

在您的Fragment 中,您可以检查其实例是否对用户可见,如下所示:

@Override
public void setUserVisibleHint(boolean visible) 
    super.setUserVisibleHint(visible);
    if (visible) 
        Log.i("Tag", "Reload fragment");
    

在提出问题之前,请务必彻底搜索答案。例如,您应该首先检查的位置是:https://developer.android.com/reference/android/support/v4/view/ViewPager.html

【讨论】:

谢谢马特。实际上我想在 Fragment 可见时更新一些视图,所以只需寻找每次用户可见 Fragment 时调用的任何回调方法 您可以创建自己的回调,例如,从您的每个Fragment 实例的setUserVisibleHint 中调用viewPager 的方法。如果你想更新同一个视图,那么这个方法本身就是你的答案。只需将 Log.i() 替换为每次片段可见时要运行的代码即可。 非常小心:“这个方法可能在片段生命周期之外被调用” 它只适用于 FragmentPagerAdapter !!!它不好【参考方案3】:

您可以使用viewPager.getCurrrentItem() 来获取当前选择的索引,并且您应该能够推断出显示的是哪个片段。但是,您可能想要的是使用addOnPageChangeListener() 添加OnPageChangeListener。这将让您跟踪选择的页面,因为它是通过实现 onPageSelected(int selected) 方法选择的。

【讨论】:

【参考方案4】:

你试过片段中的isVisible方法吗?

【讨论】:

ViewPaget2 isVisible 有助于避免当它不是当前片段时的额外调用。 如果您需要在 Fragment 可见时立即执行操作,则此方法不起作用。

以上是关于如何知道片段何时在 viewpager 中实际可见的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 Fragment 何时变得不可见

如何判断片段在 N​​avigationDrawer 中何时不可见

ViewPager 片段重新创建,已恢复但不可见

从另一个片段导航后,ViewPager在返回时不可见

检测片段内的 ViewPager 选项卡更改

检测片段内的 ViewPager 选项卡更改