2013-02-14 79 views
1

我有設置活動,其中有3個選項卡(每個選項卡包含片段)+在主要活動還有按鈕行 - 與按鈕確定,並取消。當我按OK,我想要做這樣的事情:操作欄選項卡 - 如何檢索活動中片段的值?

1)得到的所有片段 2)我所有的自定義變量將它們保存到共享首選項

可是如何才能讓訪問片段變量?我嘗試這樣做:

添加標籤的主要活動:

ActionBar.Tab tab1 = actionbar.newTab().setText(res.getString(R.string.actSettingsTab1)); 
    tab1.setTabListener(new MyTabsListener(new Tab1Fragment(), "tab1")); 
    actionbar.addTab(tab1); 
    //...similar for all tabs 

這是我的選項卡監聽器:

class MyTabsListener implements ActionBar.TabListener { 
    private Fragment fragment; 
    private String tag; 

    public MyTabsListener(Fragment fragment, String tag) { 
     this.fragment = fragment; 
     this.tag = tag; 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // do nothing 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft.replace(R.id.fragment_container, fragment, tag); 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     ft.remove(fragment); 
    } 
} 

這是我想從片段獲取變量:

Tab1Fragment tab1 = (Tab1Fragment) fm.findFragmentByTag("tab1"); 
Tab2Fragment tab2 = (Tab1Fragment) fm.findFragmentByTag("tab2"); 
Tab3Fragment tab3 = (Tab1Fragment) fm.findFragmentByTag("tab3"); 

但它很奇怪 - findFragmentByTag僅返回選定選項卡的片段,否則返回nu二。所以,當我選擇tab1並按下ok時,findFragmentByTag爲tab1返回片段,但爲其他人返回null。

也許我做錯了什麼,或者我的整個過程都是錯誤的方式。如何檢索父活動中所有片段的值並將它們保存到共享首選項?

回答

0

獨立過程分成兩個步驟:

1)收集從在實時(即所有片段的所有設置,因爲它們是由用戶改變)。使用Listener模式,以便在用戶修改給定片段負責的任何設置時,片段將公開接口,通過該接口他們將通知所連接的監聽器。讓活動將自己附加爲所有片段的偵聽器,並捕獲更改(將它們存儲在適合您的結構中)。

2)單擊確定按鈕時,讓活動使用SharedPreferences保存設置。它不必訪問片段,因爲它始終關於用戶更改的任何設置。

這樣你就不必一次訪問所有的片段,如果從內存中移除它們是不可能的(因爲它們在給定的時間不可見)。相反,您可以每次選擇/顯示時將活動重新分配給所選片段的偵聽器。

+0

好點。謝謝...順便說一句,我剛剛開始使用片段,但認真...你不覺得,他們讓代碼更難以閱讀(而不是更容易),因爲你必須認爲當片段狀態改變時總是保存所有內容,實現監聽器與父母的活動等進行交流......我的代碼比無碎片+更難理解的1/3。當然,文件碎片並不是很好 - 它不包含很多東西:( – qkx 2013-02-14 15:50:01

+0

起初我也是這麼認爲的,但是一旦你習慣了稍微不同的做法,你會看到它們提供了你更高的代碼可重用性,它當然取決於你如何設計你的片段,並且需要一些練習來獲得這個概念的大部分內容,放鬆一下,閱讀很多並不斷提問;) – 2013-02-14 16:40:40

0

我不會推薦實際訪問片段中的變量。您可以在這些片段中製作一個公共方法,以保存您想要的共享偏好設置。例如:

Tab1Fragment tab1 = (Tab1Fragment) fm.findFragmentByTag("tab1"); 
Tab2Fragment tab2 = (Tab1Fragment) fm.findFragmentByTag("tab2"); 
Tab3Fragment tab3 = (Tab1Fragment) fm.findFragmentByTag("tab3"); 
tab1.savePreferences(); 
tab2.savePreferences(); 
tab3.savePreferences(); 
+0

好主意。然而,主要的問題是,對於3個選項卡中的2個,findFragmentByTag總是返回空值(除了選定的一個) – qkx 2013-02-14 15:15:29

+0

用戶'ft.detach(片段);'在監聽器中的onTabUnselected()'方法而不是'ft.remove ...)' – 2013-02-14 16:05:13

0
ActionBar.Tab tab1 = actionbar.newTab().setText(res.getString(R.string.actSettingsTab1)); 
tab1.setTabListener(new MyTabsListener(new Tab1Fragment(), "tab1")); 
actionbar.addTab(tab1); 
//...similar for all tabs 

這並不您的片段添加到堆棧中,因此你只有選擇的選項卡,其他均爲空。

我認爲你能做的最好是通過使用getTabCount()的動作條的標籤迭代,然後你應該能夠getTabAt(INT指數),以獲得您的內容。 getCustomView()

相關問題