2011-03-11 63 views
16

您可以將片段放入片段中作爲操作欄中的選項卡嗎?片段在行動欄選項卡片段?

我有一個Android(3.0 /蜂窩)應用程序,主要活動有一個帶有3個選項卡的操作欄。選項卡被添加到我的activity的onCreate()方法中,並且選項卡片段使用TabListener添加/刪除。該代碼與http://developer.android.com/guide/topics/ui/actionbar.html#Tabs上的樣本幾乎相同。

的TabListener看起來是這樣的:

public class SwapOutTabListener implements ActionBar.TabListener { 
    public SwapOutTabListener(Fragment fragment) { 
     _fragment = fragment; 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft.add(R.id.fragment_container, _fragment, null); 
    } 

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

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

    private Fragment _fragment; 
} 

我的選項卡中有兩個是簡單的片段,它們只包含在其中一個TextView的,有點像這樣(大多數屬性爲清楚起見移除):

<LinearLayout> 
    <TextView android:text="Tab 1" /> 
</LinearLayout> 

但我的其中一個標籤的片段更復雜,並且包含兩個嵌入片段,有點像這樣:

<LinearLayout> 
    <fragment 
     android:name="...Fragment_1" 
     android:id="@+id/frag1" 
    /> 
    <fragment 
     android:name="...Fragment_2" 
     android:id="@+id/frag2" 
    /> 
</LinearLayout> 

當用戶選擇此片段的選項卡時,所有三個片段(選項卡片段,以及兩個嵌入片段)都會調用所有啓動生命週期方法(onStart(),onResume())。

但是,當用戶選擇另一個選項卡時,只有選項卡片段會得到任何生命週期結束方法(onPause(),onStop()等)。這兩個嵌入的片段從未得到任何這些調用,並且從不關閉。

這會導致問題重新選擇的選項卡時,由於運行時加載的標籤片段時重複片段ID的抱怨:

Binary XML file line #7: Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with another fragment for ...Fragment_1 

這是我的責任,以消除這些嵌入的片段,當標籤片段已移除?如果是這樣,那麼,我到底什麼時候?

+0

你能張貼執行標籤交換的TabListener代碼?在這裏發佈的問題中,還有重複的'android:id =「@ + id/frag2」'行有意或只是一個抄寫錯誤? – adamp 2011-03-11 22:58:01

+0

@adamp,是的,重複的id是一個轉錄錯誤...我編輯了這個問題來糾正這個問題。我還將我的TabListener代碼添加到問題中。 – 2011-03-11 23:40:15

回答

18

不,片段當前不在層次結構中。我研究過這樣做,但在這一點上,所有用例都是由極端過度使用片段驅動的,其中每個單獨的UI元素都作爲片段實現。這不是它們打算如何使用的,它們旨在封裝應用程序的主要頂級部分。如果你有一個層次的東西,這是你的佈局和意見。

+0

這裏是一個用例考慮。以Google I/O 2012應用程序,將其安裝在10英寸的平板電腦上。轉到會話視圖。您已將「會話」和「沙盒」選爲頂部的標籤,但我認爲您無法在此使用PageViewer,因爲您已經有了片段。我認爲使用PageViewer會很好,並且仍然可以使用Fragments作爲當前所在的選項卡。 – Justin 2012-07-12 07:19:13