2011-10-23 73 views
8

我想在我的應用程序中實現單活動多碎片設計。我打算在代碼中有幾個「屏幕」(片段佈局),我將在它們之間切換(可能會添加到後端堆棧)。Android - 在運行時更改片段佈局

根據我的理解,使用佈局對象(例如FrameLayout)設置每個屏幕中片段的佈局,佈局對象充當片段的佔位符(共享相同的ID)。由於不同的屏幕有不同的片段排列(可以是FrameLayout和另一個LinearLayout等),我想知道:如何在運行時切換片段佈局?

我明白添加/替換碎片(通過FragmentManager),但我想完整地添加一個新的佈局,其中包含他們,在一個現場活動。有點像「setContentView」交易...

我該怎麼做? 謝謝!丹尼。

+0

我在這裏發佈了單活動多碎片代碼:http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 7799391#7799391 – user999717

+0

感謝您的快速響應。不過,我認爲在像你的例子一樣的佈局中切換片段('R.id.mainframe'),並不能解決我的問題,即如何在片段佈局之間切換。特別是如果佈局是在代碼中創建的(在調用onContentView之後),就像我的情況一樣。 – DannyA

+0

哦,我明白了,所以你想重新存在現有的片段而不需要重新實例化它們?那很有意思。 – user999717

回答

4

這當然是可能的,你唯一需要做的就是生成你自己的ID。這些ID可以是任何東西,但它們不能與aapt ID(R中的那些ID)衝突,並且不能是負面的。

下面的例子說明了這一點與一組固定ID的:

public class MainActivity extends Activity { 
    private final int ID_TABLE = 0xA; 
    private final int ID_ROW1 = 0xB; 
    private final int ID_ROW2 = 0xC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.root); 
     TableLayout tl = new TableLayout(this); 
     tl.setId(ID_TABLE); 
     TableRow tr1 = new TableRow(this); 
     tr1.setId(ID_ROW1); 
     TableRow tr2 = new TableRow(this); 
     tr2.setId(ID_ROW2); 
     tl.addView(tr1); 
     tl.addView(tr2); 
     ll.addView(tl); 

     MyFragment frag1 = new MyFragment(); 
     MyFragment frag2 = new MyFragment(); 
     MyFragment frag3 = new MyFragment(); 
     MyFragment frag4 = new MyFragment(); 

     getFragmentManager().beginTransaction() 
      .add(ID_ROW1, frag1, "cell1_1") 
      .add(ID_ROW1, frag2, "cell1_2") 
      .add(ID_ROW2, frag3, "cell2_1") 
      .add(ID_ROW2, frag4, "cell2_2") 
      .commit(); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 

爲了切換到不同的佈局,可以除去碎片,並將其添加其它地方。
讓我知道它是怎麼回事。

編輯:澄清,視圖和ViewGroups不需要實例化一次,然後保持活動的一生。只要確保在刪除相關視圖之前刪除或分離了任何碎片。另外,如果您在onCreate之外創建和刪除視圖,則應確保可以使用onSaveInstanceState並在onCreate中重複該過程來恢復視圖。閱讀diagram here和關於configuration changes的段落。

+0

感謝您的努力!由於我是Android新手,我想確保自己正確理解你 - 可以在代碼中的任何位置從我的活動的主視圖中添加/刪除視圖和佈局,而不僅僅是在onCreate(I不要以爲我見過這方面的例子),然後在飛行中爲它們創建並添加片段?這不僅僅是「刪除碎片並將它們添加到其他地方」,因爲我爲它們創建了一個新的佈局。 – DannyA

+0

目標是最終將這個片段邏輯分離到不同的「屏幕」類,並讓每個類都知道它自己的佈局ID,並將它自己的片段放入其中。然後我可以通過片段交易從一個「屏幕」導航到另一個「屏幕」。例如隱藏前一個屏幕的所有片段,然後顯示新的片段。我必須承認,這種技術看起來有點奇怪,因爲它會用空白的佈局和不可見的碎片淹沒我的活動......看起來我的目標是合理的,但我還沒有找到正確的設計。 – DannyA

+0

那麼這是一個有趣的思路,但是這不是什麼活動和他們的startActivity(意圖)方法是爲什麼?您也可以免費獲得按鈕功能。 – user999717