如何检查 SectionsPagerAdapter 选项卡是不是可见
Posted
技术标签:
【中文标题】如何检查 SectionsPagerAdapter 选项卡是不是可见【英文标题】:How to check if SectionsPagerAdapter tab is visible如何检查 SectionsPagerAdapter 选项卡是否可见 【发布时间】:2014-06-02 14:27:29 【问题描述】:我有一个在嵌入式系统上运行的应用程序,在 SectionsPagerAdapter 和每个选项卡的 Fragment 中有 4 个选项卡,我有通过计时器每 0.5 秒更新一次显示的代码。
我发现当我创建 4 个选项卡时,前 2 个被创建,3 和 4 只有在我预期的向右滚动时才会创建。
对我来说,问题是在创建每个选项卡的视图并启动计时器后,即使选项卡不可见,计时器也会触发并处理更新视图的调用。
我试图找到一种方法来了解选项卡是否可见以及是否隐藏,我只是跳过视图的重新绘制。只有当标签可见时,我只有更新。
我尝试在 getView() 返回的视图中使用 isShown() 和 hasWindowFocus() 但它们总是返回 true;
我也尝试对每个片段使用 onPause 和 onResume,但只有当我从它移到第二个选项卡时才会调用它们。例如,在tab1上,移到tab2,不调用,移到tab3,调用onPause()。
现在我已经使用 onTabSelected() 将当前选项卡存储在我的单例类中,所有片段都可以从中访问系统数据。创建片段时,我传入制表符位置。
但是,如何以更优雅的方式检查此视图是否可见?
【问题讨论】:
【参考方案1】:您可以检查您要更新的Fragment
是否在附加到您的ViewPager
的OnPageListener
中被选中。在侦听器中,您可以检查是否选择了要更新计时器的页面。这是一个例子:
SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
@Override
public void onPageSelected(int page)
/*If the page is the page you want to update your timer on, enable it.*/
if ( page == myTimerPageId )
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment timerFragment = fragmentManager.findFragmentByTag("android:switcher:" + mViewPager.getId() + ":" + myTimerPageId);
timerFragment.startTimer();
/*If it is not the page you update your timer on, disable it.*/
else
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment timerFragment = fragmentManager.findFragmentByTag("android:switcher:" + mViewPager.getId() + ":" + myTimerPageId);
timerFragment.stopTimer();
@Override
public void onPageScrolled(int arg0, float arg1, int arg2)
@Override
public void onPageScrollStateChanged(int arg0)
);
你必须通过 FragmentManager 获取 Fragment,然后对 Fragment
执行任何你想做的事情,实现 startTimer()
或其他东西。 myTimerPageId
必须是您要递增计时器的页面的标识符。 findFragmentByTag
部分是从this answer 窃取的。 OnPageChangeListener
部分是从here 抓取的。
作为旁注,ViewPager
有一个setOffscreenPageLimit
,它设置在内存中保存的活动页旁边的页数。不过,这可以是最小的 1,因此无法将其与 Fragment.onPause
一起使用来实现此处的要求。如果这可以在其他情况下使用,请查看here。
【讨论】:
5 岁的答案,但它仍然可以完美运行。非常感谢!以上是关于如何检查 SectionsPagerAdapter 选项卡是不是可见的主要内容,如果未能解决你的问题,请参考以下文章
将新Fragment添加到SectionsPagerAdapter时的ClassCastException