我有一个ViewPager,每个页面都是一个Fragment视图。我想测试一个片段是否在可见区域。 Fragment.isVisible只测试
ViewPager将创建3个(默认情况下)片段,并且所有三个片段都符合上述条件,但只有一个实际上对用户可见(人类眼睛)
答案 0 :(得分:66)
这是我用来确定片段可见性的方法。
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");
}
}
答案 1 :(得分:20)
你是对的,有更好的方法来做到这一点!
在线查看FragmentPagerAdapter javadoc,您会看到有一种方法setPrimaryItem(ViewGroup container, int position, Object object):void可以完全满足您的需求。
来自javadoc
public void setPrimaryItem(ViewGroup container,int position,Object object)
调用以通知适配器当前考虑的项目 是“主要”,即向用户显示当前的一个 页。
参数container包含该页面的视图 除去。 position现在是主要的页面位置。 object由instantiateItem返回的同一对象(View, INT)。
关于滚动状态的说明
现在,如果你实现它并开始调试以了解何时调用它,你会很快注意到在准备片段和用户滑动时会多次触发。
因此,附加一个ViewPager.OnPageChangeListener并且只有在浏览器滚动状态再次变为SCOLL_STATE_IDLE时才能执行必须执行的操作可能是一个好主意。
答案 2 :(得分:9)
出于我的目的,当片段可见时,ViewPager.OnPageChangeListener.onPageSelected()
与Fragment.onActivityCreated()
一起使用可以执行操作。 Fragment.getUserVisibleHint()
也有帮助。
答案 3 :(得分:3)
我正在使用“setMenuVisibility”-Method来解决这个问题。由于每个Fragment都可以有actionbar-items,因此您可以确定哪个片段当前对用户可见。
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (!visible) {
//not visible anymore
}else{
yay visible to the user
}
}
答案 4 :(得分:3)
使用getView().isShown()
查明片段是否实际可见有什么问题?
答案 5 :(得分:3)
isVisible()
即使片段位于活动后面,仍然可以返回true。
我使用以下内容:
if (getView() != null && getView().isShown()) {
//your code here
}
答案 6 :(得分:2)
如果您知道每个片段附加到哪个“页面”,您可以使用ViewPager.getCurrentItem()来确定哪个片段是“可见的”。
答案 7 :(得分:0)
在我的情况下,当片段对用户可见时,我必须对第一个片段做一些工作
@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();
}
}
}
答案 8 :(得分:0)
setUserVisibleHint
,每次关闭另一个片段时都不会调用onHiddenChanged
。因此,您可能依赖onResume
(和onPause
),但通常会经常调用它(例如,当您打开设备屏幕时)。此外,在某些情况下,它不会被调用,您应该在主机活动中管理当前片段并写入:
if (currentFragment != null) {
currentFragment.onResume();
}
答案 9 :(得分:0)
科特林:
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()