如何测试片段视图是否对用户可见?

Dav*_* S. 72 user-interface android android-fragments android-viewpager

我有一个ViewPager,每个页面都是一个Fragment视图.我想测试一个片段是否在可见区域.Fragment.isVisible只测试

  • 片段附加到活动
  • 片段设置为可见
  • 片段已添加到视图中

ViewPager将创建3个(默认情况下)片段,并且所有三个片段都符合上述条件,但只有一个实际上对用户可见(人)

mir*_*ign 67

这是我用来确定片段可见性的方法.

private static boolean m_iAmVisible;

@Override
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser);
    m_iAmVisible = isVisibleToUser;

    if (m_iAmVisible) { 
        Log.d(localTAG, "this fragment is now visible");
    } else {  
        Log.d(localTAG, "this fragment is now invisible");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 甚至更简单,`getUserVisibleHint()` (30认同)
  • 简化为:public void setUserVisibleHint(boolean isVisibleToUser){super.setUserVisibleHint(isVisibleToUser); m_iAmVisible = isVisibleToUser;} (2认同)

hcp*_*cpl 19

你是对的有更好的方法来做到这一点!

在线查看FragmentPagerAdapter javadoc,你会看到有一个方法setPrimaryItem(ViewGroup容器,int位置,Object对象):void正是你所需要的.

来自javadoc

public void setPrimaryItem(ViewGroup container,int position,Object object)

被调用以通知适配器当前被认为是"主要"的项目,即向用户显示为当前页面的那个项目.

参数container包含要从中删除页面的View.position现在是主要的页面位置.object由instantiateItem(View,int)返回的同一对象.

滚动状态的注意事项

现在,如果你实现这个并开始调试以了解何时调用它,你会很快注意到在准备片段和用户滑动时会多次触发.

因此,附加一个ViewPager.OnPageChangeListener并且只有在viewpagers滚动状态再次变为SCOLL_STATE_IDLE时才执行必须执行的操作可能是个好主意.


Leo*_*dau 9

出于我的目的,它可以ViewPager.OnPageChangeListener.onPageSelected()Fragment.onActivityCreated()Fragment可见时一起使用来执行操作.Fragment.getUserVisibleHint()也有帮助.