如何检查 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 是否在附加到您的ViewPagerOnPageListener 中被选中。在侦听器中,您可以检查是否选择了要更新计时器的页面。这是一个例子:

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

从viewPager片段(Kotlin)中获取用户输入信息

Fragment中的ViewPager,只有选项卡才能在第一个视图上加载选项卡

您如何判断是不是使异常检查或未检查?

访问 2010 如何检查是不是检查了是/否字段

如何检查元素是不是没有特定的类?