首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android -在运行时更改片段布局

Android -在运行时更改片段布局
EN

Stack Overflow用户
提问于 2011-10-23 17:53:28
回答 2查看 17.8K关注 0票数 8

我想在我的应用程序中实现一个单活动多片段设计。我计划有几个“屏幕”(片段的布局),我将在代码中切换(可能添加到后台堆栈)。

据我所知,每个屏幕中片段的布局是使用layout对象(例如FrameLayout)设置的,这些对象充当片段的占位符(共享相同的ID)。因为不同的屏幕有不同的片段排列(一个可以是FrameLayout,另一个可以是LinearLayout,等等)我想知道:如何在运行时在片段布局之间切换?

我理解添加/替换片段(通过FragmentManager),但我想在活动活动中完全添加一个包含它们的新布局。有点像“setContentView”的事务...

我该怎么做呢?谢谢!丹尼。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-23 23:14:40

这当然是可能的,你唯一需要做的就是生成你自己的is。in可以是任何值,但它们不得与aapt in(R中的in)冲突,并且不得为负。

下面的示例使用一组固定ID演示了这一点:

代码语言:javascript
复制
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的段落。

票数 4
EN

Stack Overflow用户

发布于 2020-09-22 02:00:20

代码语言:javascript
复制
this.loadFragment(AlarmExample.newInstance())
this.loadFragment(XmlParsingFragment.newInstance())

private fun loadFragment(fragment: Fragment) {
    supportFragmentManager.beginTransaction()
        .replace(R.id.fragmentContainer, fragment)
        .commit()
}

通过这种方式,您可以根据自己的需求设置任何片段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7865438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档