這當然是可能的,你唯一需要做的就是生成你自己的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的段落。
我在這裏發佈了單活動多碎片代碼:http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 7799391#7799391 – user999717
感謝您的快速響應。不過,我認爲在像你的例子一樣的佈局中切換片段('R.id.mainframe'),並不能解決我的問題,即如何在片段佈局之間切換。特別是如果佈局是在代碼中創建的(在調用onContentView之後),就像我的情況一樣。 – DannyA
哦,我明白了,所以你想重新存在現有的片段而不需要重新實例化它們?那很有意思。 – user999717