我有一个ViewPager,每个页面都是一个Fragment视图。我想测试片段是否在可见区域中。Fragment.isVisible仅测试
- 片段附加到活动上
- 片段设置为可见
- 该片段已添加到视图
ViewPager将创建3个(默认情况下)片段,并且所有三个片段均满足上述条件,但实际上只有一个对用户可见(人眼)
Answers:
您是对的,有更好的方法可以做到这一点!
在线查看FragmentPagerAdapter Javadoc,您会看到有一个方法setPrimaryItem(ViewGroup container,int position,Object object):避免完全执行所需的操作。
从javadoc
public void setPrimaryItem(ViewGroup容器,int位置,Object对象)
被调用以通知适配器当前哪个项目被视为“主要”项目,即作为当前页面显示给用户的项目。
参数容器将从其中删除页面的包含View。position现在是主要页面位置。object InstantiateItem(View,int)返回的同一对象。
注意滚动状态
现在,如果实现了这一点并开始调试以了解何时确切调用此方法,您将很快注意到在准备片段和用户轻扫时已多次触发该操作。
因此,最好还附加一个ViewPager.OnPageChangeListener,并且仅在viewpagers滚动状态再次变为SCOLL_STATE_IDLE时才执行必须做的事情。
Application
该类并必须测试是否显示了特定的UI,则此方法效果很好。我刚结束时使用了几个布尔值来测试应用程序是否已后台运行,以及是否显示了特定片段。
这就是我用来确定片段可见性的方法。
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");
}
}
public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); m_iAmVisible = false; //default to not visible if (isVisibleToUser) { m_iAmVisible = true; } }
getUserVisibleHint()
isVisible()
即使该片段在活动之后,仍可以返回true。
我正在使用以下内容:
if (getView() != null && getView().isShown()) {
//your code here
}
在我的情况下,当用户看到片段时,ia必须对第一个片段做一些工作
@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();
}
}
}
科特林:
if (userVisibleHint) {
// the fragment is visible
} else {
// the fragment is not visible
}
爪哇
if (getUserVisibleHint()) {
// the fragment is visible
} else {
// the fragment is not visible
}
https://developer.android.com/reference/android/app/Fragment.html#getUserVisibleHint()