0

我在我的应用程序的新版本中使用ActionBarSherlock和TabViewPager,并且我试图在某个选项卡处于活动状态时执行某些代码仅限。首先,让我告诉你如何设置我的TabHost并将碎片添加到它。片段具体onResume

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(); 
     } 
    } 

似乎也该片段的得到的onResume只要主活动启动,所以我不能打电话的有内部片段特定代码检测改变调用。

我唯一的想法是使用onResumeFragments(),但似乎没有为类型SherlockFragment定义 - 不确定这是ActionBarSherlock的错误还是它应该是错误的。

任何帮助将不胜感激!

+1

您可以发布使用'onTabChanged'时发生的异常吗?这是一个'NullPointerException'? – Luksprog

+0

是的,它是一个NullPointerException - 我以为我原本没有正确引用Tab2,但提案填充了我在该片段中的所有函数/方法。 – mattdonders

+1

我没有完全得到你的评论。回调中的空值是什么?我的假设是'tabFragment'变量是'null',因为片段管理器没有找到它(如果是这种情况,请发布你的'ViewPager'的适配器代码)。如果另一个变量为空,并抛出异常指出并给出有关它的使用的更多细节。 – Luksprog

回答

0

有人提到,因为我的碎片在列表中,并从列表中获取我需要的碎片。我全局初始化我的列表/矢量,然后能够从列表中检索片段并在选项卡更改时根据需要调用其各自的功能,并且它像魅力一样工作。

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(); 
} 
相关问题