Android developer documentation for fragments说:
“注意:通过定义片段将片段添加到活动布局中 在布局XML文件中的片段,您无法删除片段 运行。如果您打算在用户期间将片段交换进出 交互时,必须将片段添加到活动时 活动首先开始,如下一课所示。“
部分原因是我养成了总是使用片段管理器向我的用户界面添加/删除片段的习惯(即使我不想在运行时“热交换”它们)。我100%肯定当我尝试在运行时删除/替换“硬连线”XML片段时,我的应用程序崩溃,但有异常。
我几个月来没有真正使用过XML片段,但是今天,在一个百灵鸟上,我决定玩游戏,我发现我能够将XML片段交换为其他片段......它有效吗?我在网上找不到任何讨论此行为最近变化的内容。它只是有效。
我的布局代码在这里:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fl_frag"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="mobappdev.demo.myapplication.MainActivity">
<fragment
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/frag"
android:name="mobappdev.demo.myapplication.BlankFragment"/>
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="@string/click_me"
android:onClick="clickMe"/>
</LinearLayout>
以下是替换片段的代码:
public void clickMe(View view) {
FragmentManager manager = getSupportFragmentManager();
BlankFragment newFrag = BlankFragment.newInstance();
Fragment oldFrag = manager.findFragmentById(R.id.frag);
Log.i("TESTING", "old frag is null: " + (oldFrag == null));
manager.beginTransaction()
.replace(R.id.fl_frag, newFrag)
.commit();
}
它没有任何问题。我尝试过各种变体(例如将XML片段放在FrameLayout中),这一切看起来都很好。我甚至尝试过诸如删除/添加之类的变体,只需删除它,所有工作都没有问题。
那么我错过了什么?
答案 0 :(得分:1)
您不是替换片段本身,而是在该片段之上添加新片段。它只是ID的一个小问题,但你要使用容器上的FragmentManager(LinearLayout)替换而不是在片段本身上进行替换(R.id.fl_frag而不是R.id.frag)