我有一个在SectionsPagerAdapter上有4个选项卡的嵌入式系统上运行的应用程序,在每个选项卡的片段中,我有代码,通过计时器每隔0.5秒更新一次显示。
我发现当我创建4个选项卡时,前2个选项被创建,只有当我向右滚动时才会创建3和4。
对我来说,问题是在创建每个选项卡的视图并启动计时器后,计时器将触发,即使选项卡不可见,也会处理更新视图的调用。
我试图找到一种方法来了解标签是否可见,如果它被隐藏,我只是跳过重新绘制视图。只有当标签可见时才进行更新。
我已尝试在getView()返回的视图中使用isShown()和hasWindowFocus(),但它们总是返回true;
我还试图为每个片段使用onPause和onResume,但是当我从它移动到第2个标签时它们才被调用。例如,在tab1上,移动到tab2,未调用,移动到tab3,onPause()调用。
现在我已经使用onTabSelected()将当前选项卡存储在我的单例类中,所有片段都可以从中访问系统数据。当我创建片段时,我传递了标签位置。
但是,如何以更优雅的方式检查此视图是否可见?
答案 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。