我在我的应用程序的新版本中使用ActionBarSherlock和TabViewPager,并且当某个选项卡处于活动状态时,我正尝试执行某些代码 ONLY 。首先,让我告诉你我是如何设置我的TabHost并将碎片添加到它。
private void intialiseViewPager() {
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, TabFragment1.class.getName()));
fragments.add(Fragment.instantiate(this, TabFragment2.class.getName()));
if (appVersionV3()) {
fragments.add(Fragment.instantiate(this, TabFragment3.class.getName()));
}
this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments);
//
this.mViewPager = (ViewPager)super.findViewById(R.id.viewpager);
this.mViewPager.setAdapter(this.mPagerAdapter);
this.mViewPager.setOnPageChangeListener(this);
}
/**
* Initialise the Tab Host
*/
private void initialiseTabHost(Bundle args) {
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
mTabHost.setup();
TabInfo tabInfo = null;
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab1").setIndicator("Calculator"), ( tabInfo = new TabInfo("Calculator", TabFragment1.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab2").setIndicator("Tracker"), ( tabInfo = new TabInfo("Tracker", TabFragment2.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
if (appVersionV3()) {
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab3").setIndicator("Food List"), ( tabInfo = new TabInfo("FoodList", TabFragment3.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
}
// Default to first tab
//this.onTabChanged("Tab1");
//
mTabHost.setOnTabChangedListener(this);
}
private static void AddTab(TabsViewPagerFragmentActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) {
// Attach a Tab view factory to the spec
tabSpec.setContent(activity.new TabFactory(activity));
tabHost.addTab(tabSpec);
}
我的第一个想法是从Activity onTabChanged调用片段的方法,但是什么不起作用。请参阅下面的我的尝试 - 它只是强制关闭应用程序,如果需要,我可以获取此崩溃的日志。
public void onTabChanged(String tag) {
//TabInfo newTab = this.mapTabInfo.get(tag);
int pos = this.mTabHost.getCurrentTab();
mTabHost.getCurrentTabView().invalidate();
this.mViewPager.setCurrentItem(pos);
if (pos == 1) {
TabFragment2 tabFragment = (TabFragment2) getSupportFragmentManager().findFragmentByTag("Tracker");
tabFragment.calculatePoints();
}
}
似乎主要活动一启动就会调用Fragment的onResume,因此我无法在其中调用特定于片段的代码来检测更改。
我唯一的另一个想法是使用onResumeFragments()
,但似乎没有为类型SherlockFragment
定义 - 不确定这是否是ActionBarSherlock的错误或是否错误那是怎么回事。
非常感谢任何帮助!
答案 0 :(得分:0)
有人提到,因为我的片段在列表中,只是从列表中获取我需要的片段。我全局初始化了我的List / Vector,然后能够从列表中检索Fragment并根据需要在选项卡更改时调用其各自的函数,它就像一个魅力。
public void onTabChanged(String tag) {
//TabInfo newTab = this.mapTabInfo.get(tag);
int pos = this.mTabHost.getCurrentTab();
mTabHost.getCurrentTabView().invalidate();
this.mViewPager.setCurrentItem(pos);
// calculatePoints on TabChange
if (pos == 1) {
TabFragment2 fragTrack = (TabFragment2) fragments.get(1);
fragTrack.calculatePoints();
fragTrack.createAndFillDatabase();
}
else if (pos ==2) {
TabFragment3 fragFoodList = (TabFragment3) fragments.get(2);
fragFoodList.createAndFillDatabase("none");
}
this.supportInvalidateOptionsMenu();
}