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

时间:2012-02-17 05:18:52

标签: android user-interface android-fragments android-viewpager

我有一个ViewPager,每个页面都是一个Fragment视图。我想测试一个片段是否在可见区域。 Fragment.isVisible只测试

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

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

10 个答案:

答案 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)

可能无法调用{p> 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()

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