这当然是可能的,你唯一需要做的就是生成你自己的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