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

我有一个 ViewPager,每个页面都是一个碎片视图。我想测试片段是否在可见区域。仅可见的片段测试

  • 碎片附着在一个活动上
  • 片段设置为可见
  • 片段已被添加到视图中

ViewPager 将创建3个(默认情况下)片段,并且所有三个片段都符合上述条件,但是用户实际上只能看到一个片段(人类 眼睛)

60228 次浏览

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

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

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

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

在线查看 片段页面适配器 javadoc,您将看到有一个方法 SetPrimaryItem (ViewGroup 容器,int 位置,Object 对象) : void正好满足您的需要。

来自 javadoc

Public void setPrimaryItem (ViewGroup 容器,int 位置,Object 对象)

调用以通知适配器当前考虑哪个项 是“主要的”,这是一个显示给用户作为当前 呼叫。

参数容器页将从其中包含的视图 现在是主要的页面位置。 对象由 instantiateItem (View, Int).

关于滚动状态的说明

现在,如果您实现了这个并开始调试以获得调用它的确切时间,那么您将很快注意到,在准备片段时以及用户在滑动时,这个过程被触发了几次。

因此,也可能是一个好主意,附加一个 OnPageChangeListener,并且只做必须做的事情,一旦查看页面滚动状态再次成为 空闲状态

出于我的目的,当片段可见时,使用 ViewPager.OnPageChangeListener.onPageSelected()Fragment.onActivityCreated()一起执行操作是可行的。Fragment.getUserVisibleHint()也有帮助。

我正在使用“ setMenuVisiability”-方法来解决这个问题。因为每个片段都可以有 actionbar-item,所以这是您可以确定哪个片段当前对用户可见的部分。

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

使用 getView().isShown()查找片段是否实际可见有什么错误?

isVisible()

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

我使用以下方法:

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

在我的例子中,当片段对用户可见时,我必须对第一个片段做一些工作

 @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。因此,您可能依赖于 onResume(和 onPause) ,但它通常被调用得太频繁(例如,当您打开设备屏幕时)。另外,在某些情况下它不被调用,您应该管理主机活动中的当前片段并写下:

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

科特林:

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

Https://stackoverflow.com/a/12523627/2069407