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(); 
} 
相關問題