【发布时间】:2016-10-07 12:38:49
【问题描述】:
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 中),一切似乎都很好。我什至尝试了诸如删除/添加之类的变体,然后只是删除,这一切都没有问题。
那么我错过了什么?
【问题讨论】:
-
也许他们修好了?
-
嗯,这不是错误,而是一项功能。但即使他们改变了它,当前的文档(上面链接)仍然说它不能完成。
-
如果是这种情况,可以尝试使用常规的 FragmentManager 而不是支持,看看它是否仍然存在。支持 FragmentManager 毕竟只是系统的一个模拟,所以它必须做不同的事情。
-
因为这个原因,我已经很多年没有使用 XML 版本了。
标签: java android xml android-fragments layout