如何知道片段何时在 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方法吗?
【讨论】:
ViewPaget2isVisible
有助于避免当它不是当前片段时的额外调用。
如果您需要在 Fragment 可见时立即执行操作,则此方法不起作用。以上是关于如何知道片段何时在 viewpager 中实际可见的主要内容,如果未能解决你的问题,请参考以下文章