问题:ViewPager中的Fragment onResume()在片段实际可见之前被激发。
例如,我有2个带有ViewPager和FragmentPagerAdapter的片段。第二个片段仅对授权用户可用,我需要在片段可见时要求用户登录(使用警告对话框)。
但是,当第一个片段可见时,ViewPager创建第二个片段,以便缓存第二个碎片,并在用户开始滑动时使其可见。
因此,onResume()事件在第二个片段可见之前很久就被激发了。这就是为什么我试图找到一个事件,当第二个片段变得可见时,该事件会触发,以便在适当的时候显示对话框。
如何做到这一点?
可能很晚了。这对我很有用。我稍微更新了@Gobar和@kris解决方案的代码。我们必须更新PagerAdapter中的代码。
每当选项卡可见并返回其位置时,都会调用setPrimaryItem。如果位置相同,意味着我们不动。如果位置已更改且当前位置不是我们单击的选项卡设置为-1。
private int mCurrentPosition = -1;
@Override
public void setPrimaryItem(@NotNull ViewGroup container, int position, @NotNull Object object) {
// This is what calls setMenuVisibility() on the fragments
super.setPrimaryItem(container, position, object);
if (position == mCurrentPosition) {
return;
}
if (object instanceof YourFragment) {
YourFragment fragment = (YourFragment) object;
if (fragment.isResumed()) {
mCurrentPosition = position;
fragment.doYourWork();//Update your function
}
} else {
mCurrentPosition = -1;
}
}
我重写了关联的FragmentStatePagerAdapter的Count方法,并让它返回总计数减去要隐藏的页数:
public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter
{
private List<Fragment> _fragments;
public int TrimmedPages { get; set; }
public MyAdapter(Android.App.FragmentManager fm) : base(fm) { }
public MyAdapter(Android.App.FragmentManager fm, List<Android.App.Fragment> fragments) : base(fm)
{
_fragments = fragments;
TrimmedPages = 0;
}
public override int Count
{
//get { return _fragments.Count; }
get { return _fragments.Count - TrimmedPages; }
}
}
因此,如果最初有3个片段添加到ViewPager中,并且在满足某些条件之前只应显示前2个片段,则通过将TrimmerdPages设置为1来覆盖页面计数,并且它应只显示前两个页面。
这对结尾的页面很有用,但对开头或中间的页面没有帮助(尽管有很多方法)。