如何确定Fragment何时在ViewPager中可见

问题: ViewPager片段onResume()在片段实际可见之前被触发。

例如,我有2个片段与ViewPagerFragmentPagerAdapter 。 第二个片段仅适用于授权用户,我需要让用户在片段变为可见时使用警报对话框登录。

ViewPager在第一个可见时创建第二个片段,以便缓存第二个片段,并在用户开始滑动时使其可见。

因此onResume()事件在第二个片段变得可见之前很久被触发。 这就是为什么我试图找到一个事件,当第二个片段在适当的时候变为可见并显示一个对话框时就会触发事件。

如何才能做到这一点?


更新 :Android支持库(修订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 Support Library pre-r11中使用FragmentStatePagerAdapter ,则预缓存片段也会处于“可见”状态(实际上不可见)。

我重写:

public class MyFragment extends Fragment {
    @Override
    public void setMenuVisibility(final boolean visible) {
        super.setMenuVisibility(visible);
        if (visible) {
            // ...
        }
    }
   // ...
}

为了捕获片段的焦点状态,我认为这是您所说的“可见性”的最适合状态,因为ViewPager中只有一个片段实际上可以将其菜单项与父项活动的项目一起放置。


如何确定Fragment何时在ViewPager中可见

你可以通过在你的Fragment重写setUserVisibleHint来完成以下工作:

public class MyFragment extends Fragment {
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
        }
        else {
        }
    }
}

这似乎恢复了您期望的正常onResume()行为。 它按住主键离开应用程序,然后重新进入应用程序,发挥很好。 onResume()不会连续调用两次。

@Override
public void setUserVisibleHint(boolean visible)
{
    super.setUserVisibleHint(visible);
    if (visible && isResumed())
    {
        //Only manually call onResume if fragment is already visible
        //Otherwise allow natural fragment lifecycle to call onResume
        onResume();
    }
}

@Override
public void onResume()
{
    super.onResume();
    if (!getUserVisibleHint())
    {
        return;
    }

    //INSERT CUSTOM CODE HERE
}
链接地址: http://www.djcxy.com/p/23145.html

上一篇: How to determine when Fragment becomes visible in ViewPager

下一篇: findViewById in Fragment