【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
问题:在片段实际可见之前,已触发ViewPager
片段onResume()
。
例如,我有2个带有ViewPager
和FragmentPagerAdapter
。 第二个片段仅适用于授权用户,我需要让用户在该片段可见时登录(使用警报对话框)。
但是,当第一个片段可见时, ViewPager
会创建第二个片段,以便缓存第二个片段,并在用户开始滑动时使其可见。
因此, onResume()
事件在它可见之前就在第二个片段中触发了。 这就是为什么我试图找到一个事件,该事件在第二个片段变得可见时触发,并在适当的时候显示一个对话框。
如何才能做到这一点?
#1楼
如何确定片段何时在ViewPager中可见
你可以通过覆盖以下setUserVisibleHint
在你的Fragment
:
public class MyFragment extends Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
}
else {
}
}
}
#2楼
这是使用onPageChangeListener
另一种方式:
ViewPager pager = (ViewPager) findByViewId(R.id.viewpager);
FragmentPagerAdapter adapter = new FragmentPageAdapter(getFragmentManager);
pager.setAdapter(adapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int pageNumber) {
// Just define a callback method in your fragment and call it like this!
adapter.getItem(pageNumber).imVisible();
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
#3楼
为此重写Fragment.onHiddenChanged()
。
public void onHiddenChanged(boolean hidden)
当片段的隐藏状态(由
isHidden()
返回)已更改时调用。 片段开始时没有隐藏; 每当片段从该状态更改状态时,将调用此方法。参量
hidden
-boolean
:如果片段现在被隐藏,则为true;如果不可见,则为false。
#4楼
更新 :Android支持库(rev 11)最终修复了用户可见的提示问题 ,现在,如果您将支持库用于片段,则可以安全地使用getUserVisibleHint()
或重写setUserVisibleHint()
来捕获戈尔恩答案所述的更改。
更新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中只有一个片段实际上可以将其菜单项与父活动的项一起放置。
#5楼
我覆盖了关联的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; }
}
}
因此,如果最初在ViewPager中添加了3个片段,并且仅在满足某些条件之前才显示前2个片段,请通过将TrimmedPages设置为1来覆盖页数,并且它应仅显示前两个页面。
这对于末尾的页面效果很好,但是对于开始或中间的页面却没有真正的帮助(尽管有很多方法可以做到这一点)。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3154728