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

我有一个ViewPager,每个页面是一个片段视图。 我想testing一个片段是否在可见区域。 Fragment.isVisible唯一的testing

  • 该片段被附加到一个活动
  • 该片段设置为可见
  • 该片段已被添加到视图

ViewPager将创build3个(默认)片段,并且它们全部三个满足上述标准,但是只有一个实际上对于用户(人 )是可见的,

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

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

从javadoc

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

被调用以通知适配器哪个项目当前被认为是“主要”,即作为当前页面显示给用户。

参数容器包含将从中删除页面的视图。 位置现在是主要的页面位置。 object由instantiateItem(View,int)返回的相同对象。

请注意滚动状态

现在,如果你实现了这一点,并开始debugging,以确定何时被调用,你会很快注意到在准备片段时以及在用户一直在滑动时,会触发这个过程。

因此,附加一个ViewPager.OnPageChangeListener也是一个好主意,只有当viewpage滚动状态再次变为SCOLL_STATE_IDLE时,才能做什么。

这是我用来确定一个片段的可见性。

 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"); } } 

对于我的目的,它使用ViewPager.OnPageChangeListener.onPageSelected()结合Fragment.onActivityCreated()来执行一个行动,当碎片是可见的。 Fragment.getUserVisibleHint()帮助。

使用getView().isShown()来查明一个Fragment是否真的可见?

 isVisible() 

即使片段位于某个活动的后面,仍然可以返回true。

我正在使用以下内容:

 if (getView() != null && getView().isShown()) { //your code here } 

如果您知道每个片段附加到哪个“页面”,则可以使用ViewPager.getCurrentItem()来确定哪个片段“可见”。

我正在使用“setMenuVisibility” – 解决这个问题的方法。 由于每个片段都可以具有操作栏项目,因此可以确定哪个片段当前对用户可见。

 @Override public void setMenuVisibility(final boolean visible) { super.setMenuVisibility(visible); if (!visible) { //not visible anymore }else{ yay visible to the user } } 

在我的情况下,当片段对用户可见时,必须在第一个片段上做一些工作

  @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(viewPager.getAdapter() instanceof YourPager) { Fragment fragemnt=((YourPager)viewPager.getAdapter()).getFragment(0); //getFragment(int index) custom method if( fragemnt instanceof YourFragment) { ((YourFragment)fragemnt).methodWhochShouldBeCalledAfterUIVisible(); } } } 

setUserVisibleHint可能不会被调用, onHiddenChanged可能不是每次调用另一个片段时被closures。 所以,你可以依靠onResume (和onPause ),但是它通常被称为太频繁(例如,当你打开设备屏幕)。 在某些情况下,它也不会被调用,您应该pipe理主机活动中的当前片段并写入:

 if (currentFragment != null) { currentFragment.onResume(); }