检查片段当前是否可见或不可见
检查片段当前是否可见或不可见
我知道在StackOverflow上有很多类似的问题,但我的问题略有不同。
我有一个嵌套的Fragment层次结构,如下所示:
现在我想知道DFragment
是否对用户可见?
我尝试了很多StackOverflow上的解决方案,但没有成功。
我尝试了setUserVisibleHint()
,但它对上面层次结构中的多个DFragment
都返回true
,这是ViewPager
的原因。
我还尝试了这些链接:link1,link2,link3等等...但没有得到实际的解决方案。
等待帮助。谢谢。
更新
适配器类:
class ViewPagerAdapter extends FragmentPagerAdapter { private final ListmFragmentList = new ArrayList<>(); private final List mFragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } public void addFragment(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } }
问题原因:需要判断一个fragment是否当前可见,以便在可见时执行相应的操作。
解决方法:使用isVisible()
方法进行额外的可见性检查。
整理成的文章如下:
给这个方法一个尝试...
isVisible()
方法可以额外增加一层可见性检查。
以下是一个示例代码:
ViewPager viewPager=(ViewPager)findViewById(R.id.view_pager); final Fragment[] fragments={new DFragment(),new MyFragment()}; //添加所有其他在view pager中的fragment对象...... viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } public void onPageSelected(int position) { if(fragments[position].isVisible()){ //在fragment可见时执行的操作 } } public void onPageScrollStateChanged(int state) { } });
问题的原因是要判断一个fragment是否当前可见,根据给出的代码,可以通过获取fragment的根视图,然后调用getGlobalVisibleRect()方法来判断视图是否可见。如果视图可见,返回true,否则返回false。但是根据其他人的经验,这种解决方法可能不适用于所有情况,可以尝试使用userVisibleHint属性来判断fragment的可见性。另外,对于在ViewPager中的fragment,可以将getGlobalVisibleRect()方法包装在一个post runnable中来实现更好的效果。
解决方法如下:
1. 获取fragment的根视图:View fragmentRootView = fragment.getView();
2. 判断视图是否可见:
- 如果fragmentRootView不为空且调用fragmentRootView.getGlobalVisibleRect(new Rect())返回true,则表示fragment可见。
- 否则,表示fragment不可见。
另外,可以尝试使用userVisibleHint属性来判断fragment的可见性,该属性可以通过fragment的setUserVisibleHint()方法来设置。
对于在ViewPager中的fragment,可以将getGlobalVisibleRect()方法包装在一个post runnable中来实现更好的效果,代码如下:
fragmentRootView.post(new Runnable() { public void run() { fragmentRootView.getGlobalVisibleRect(new Rect()); } });这样可以更准确地判断fragment在ViewPager中的可见性。