如何检查SectionsPagerAdapter选项卡是否可见

时间:2014-04-18 05:31:24

标签: android android-fragments tabs

我有一个在SectionsPagerAdapter上有4个选项卡的嵌入式系统上运行的应用程序,在每个选项卡的片段中,我有代码,通过计时器每隔0.5秒更新一次显示。

我发现当我创建4个选项卡时,前2个选项被创建,只有当我向右滚动时才会创建3和4。

对我来说,问题是在创建每个选项卡的视图并启动计时器后,计时器将触发,即使选项卡不可见,也会处理更新视图的调用。

我试图找到一种方法来了解标签是否可见,如果它被隐藏,我只是跳过重新绘制视图。只有当标签可见时才进行更新。

我已尝试在getView()返回的视图中使用isShown()和hasWindowFocus(),但它们总是返回true;

我还试图为每个片段使用onPause和onResume,但是当我从它移动到第2个标签时它们才被调用。例如,在tab1上,移动到tab2,未调用,移动到tab3,onPause()调用。

现在我已经使用onTabSelected()将当前选项卡存储在我的单例类中,所有片段都可以从中访问系统数据。当我创建片段时,我传递了标签位置。

但是,如何以更优雅的方式检查此视图是否可见?

1 个答案:

答案 0 :(得分:1)

您可以检查Fragment附加的OnPageListener是否已选择要更新的ViewPager。在监听器中,您可以检查是否选择了要更新计时器的页面。这是一个例子:

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