我想在我的应用程序中实现一个单活动多片段设计。我计划有几个“屏幕”(片段的布局),我将在代码中切换(可能添加到后台堆栈)。
据我所知,每个屏幕中片段的布局是使用layout对象(例如FrameLayout)设置的,这些对象充当片段的占位符(共享相同的ID)。因为不同的屏幕有不同的片段排列(一个可以是FrameLayout,另一个可以是LinearLayout,等等)我想知道:如何在运行时在片段布局之间切换?
我理解添加/替换片段(通过FragmentManager),但我想在活动活动中完全添加一个包含它们的新布局。有点像“setContentView”的事务...
我该怎么做呢?谢谢!丹尼。
发布于 2011-10-23 23:14:40
这当然是可能的,你唯一需要做的就是生成你自己的is。in可以是任何值,但它们不得与aapt in(R中的in)冲突,并且不得为负。
下面的示例使用一组固定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的段落。
发布于 2020-09-22 02:00:20
this.loadFragment(AlarmExample.newInstance())
this.loadFragment(XmlParsingFragment.newInstance())
private fun loadFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, fragment)
.commit()
}通过这种方式,您可以根据自己的需求设置任何片段。
https://stackoverflow.com/questions/7865438
复制相似问题