如何确定在ViewPager中Fragment何时变为可见
如何确定在ViewPager中Fragment何时变为可见
问题:在ViewPager中,片段onResume()在片段实际可见之前被触发。例如,我有2个带有ViewPager和FragmentPagerAdapter的片段。第二个片段仅对已经授权的用户可用,而我需要在片段变得可见时(使用警示对话框)要求用户登录。但是ViewPager在第一个片段可见时创建第二个片段,以缓存第二个片段并在用户开始滑动时使其可见。因此,onResume()事件在第二个片段变得可见之前就已经被触发了。这就是为什么我正在尝试找到在第二个片段变得可见时能够触发的事件,以在适当的时候显示对话框。这该如何完成?
admin 更改状态以发布 2023年5月21日
更新: Android支持库 (rev 11) 最终修复了用户可见提示问题,现在如果您使用支持库进行碎片,则可以安全地使用getUserVisibleHint()
或覆盖setUserVisibleHint()
来捕获如Gorn的回答所描述的更改。
更新1: getUserVisibleHint()
存在一个小问题,即默认情况下此值为true
。
// Hint provided by the app that this fragment is currently visible to the user. boolean mUserVisibleHint = true;
因此,在调用setUserVisibleHint()
之前尝试使用它可能会出现问题。作为解决方法,您可以在onCreate
方法中设置值,如下所示。
public void onCreate(@Nullable Bundle savedInstanceState) { setUserVisibleHint(false);
过时的答案:
在大多数情况下,ViewPager
一次只显示一页,但如果您使用Android支持库pre-r11
中的FragmentStatePagerAdapter
,则预缓存的碎片也会置于“可见”状态(实际上是不可见的)。
我重写了:
public class MyFragment extends Fragment { @Override public void setMenuVisibility(final boolean visible) { super.setMenuVisibility(visible); if (visible) { // ... } } // ... }
为了捕获碎片的焦点状态,我认为它是您所说的“可见性”的最合适的状态,因为只有ViewPager中的一个碎片实际上可以将其菜单项与父活动的菜单项放在一起。