以编程方式替换片段

Posted

技术标签:

【中文标题】以编程方式替换片段【英文标题】:Replace a fragment programmatically 【发布时间】:2012-04-24 17:45:15 【问题描述】:

我有三个片段,如下图所示。我已经使用 .xml 文件在 LinearLayout 中添加了所有这三个片段,当我的启动器活动启动时,我使用 setContentView 加载该 .xml 布局。我在片段 2 上有一些控件。点击任何一个加载 fragment4 以编程方式使用 FragmentTransaction 和 commit 方法。此片段已添加到屏幕,但问题是按语法添加的片段 4 占据了整个屏幕区域。可能是什么问题?注意:在任何项目上单击 f2 我只想用新片段 f4 替换 f2。请记住,我已通过 xml 布局文件添加了 f1、f2、f3,并以编程方式添加了新片段 f4。

【问题讨论】:

不清楚。最后你把这四个片段一起展示了吗? 【参考方案1】:

您应该始终以编程方式添加、删除和替换您的片段。因此,我建议您将 F-1、F-2 和 F-3 片段替换为 FrameLayout 等容器。

基本上不是将<fragment/> 元素设置为F-1,而是将其设置为<FrameLayout/> 元素。然后在 FragmentActivity 的 onCreate 中执行片段事务:

Fragment1 f1 = new Fragment1();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.f1_container, f1); // f1_container is your FrameLayout container
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();  

现在,假设您已为 F-1、F-2 和 F-3 执行此操作。然后,通过在 OnClickListener 中再次执行相同的操作,将 f2 替换为 f4:

public void onClick(View v) 
    Fragment4 f4 = new Fragment4();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.f2_container, f4); // f2_container is your FrameLayout container
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commit();   

【讨论】:

你有什么参考可以让我从那里举个例子吗? 谢谢。好的,我理解的是不要将片段直接放入 xml 布局中。用框架布局代替片段元素。并且在用 f2 替换 f4 时使用 f2 的框架。我对吗?你可以给参考网站看看。【参考方案2】:

仅保留 FrameLayout 作为 XML 中片段的占位符。在 OnCreate 中加载框架布局中的片段。片段的 OnClick,将特定 FrameLayout 的 id 指定为 Fragment4 替换。

【讨论】:

以上是关于以编程方式替换片段的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式切换片段

Android:以编程方式在片段中添加多个 RecyclerView

ViewPager2:以编程方式选择特定片段

以编程方式返回到 backstack 中的上一个片段

以编程方式将按钮添加到片段

在片段中以编程方式在视图中包含布局