如何确定片段何时在ViewPager中可见

假装没事ソ 提交于 2020-01-08 11:36:18

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

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

但是,当第一个片段可见时, 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来覆盖页数,并且它应仅显示前两个页面。

这对于末尾的页面效果很好,但是对于开始或中间的页面却没有真正的帮助(尽管有很多方法可以做到这一点)。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!