如何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(); }