是否可以在 `Fragment` 中膨胀包含 `FragmentContainerView` 的视图?
Is it possible to inflate a view that contains `FragmentContainerView` inside a `Fragment`?
我正在尝试膨胀包含 FragmentContainerView
的视图,该视图包含在要放入布局的片段中。
- 根视图
- 片段
- 自定义视图
- FragmentContainerView
像这样:
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.main_content, Frag(), "tag");
transaction.commitNowAllowingStateLoss()
其中 Frag
创建了一个像下面这样的 xml 膨胀的视图:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:parentTag="android.widget.FrameLayout">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
</merge>
但是当我执行代码时,我的应用程序崩溃了:
Caused by: java.lang.IllegalStateException: FragmentManager is already executing transactions
如何在使用 FragmentContainerView
时避免此错误(观察:如果我使用 <fragment>
而不是 <androidx.fragment.app.FragmentContainerView>
,一切正常)
在嵌套片段时,您应该始终、始终使用 childFragmentManager
- childFragmentManager
在其父级经历生命周期更改时永远不会执行事务(我假设是在您调用事务时).
当您使用 <fragment>
标签时,这实际上会悄悄地给您带来问题,因为这些生命周期事件实际上并不作为事务发生,而是直接作为 inflation 的一部分发生。使用错误的 FragmentManager
意味着片段及其视图将无法正确保存和恢复它们的状态。
它因 FragmentContainerView
而失败的原因是 FragmentContainerView
实际上与您通常所做的 FragmentTransaction
相同。
我正在尝试膨胀包含 FragmentContainerView
的视图,该视图包含在要放入布局的片段中。
- 根视图
- 片段
- 自定义视图
- FragmentContainerView
- 自定义视图
- 片段
像这样:
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.main_content, Frag(), "tag");
transaction.commitNowAllowingStateLoss()
其中 Frag
创建了一个像下面这样的 xml 膨胀的视图:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:parentTag="android.widget.FrameLayout">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
</merge>
但是当我执行代码时,我的应用程序崩溃了:
Caused by: java.lang.IllegalStateException: FragmentManager is already executing transactions
如何在使用 FragmentContainerView
时避免此错误(观察:如果我使用 <fragment>
而不是 <androidx.fragment.app.FragmentContainerView>
,一切正常)
在嵌套片段时,您应该始终、始终使用 childFragmentManager
- childFragmentManager
在其父级经历生命周期更改时永远不会执行事务(我假设是在您调用事务时).
当您使用 <fragment>
标签时,这实际上会悄悄地给您带来问题,因为这些生命周期事件实际上并不作为事务发生,而是直接作为 inflation 的一部分发生。使用错误的 FragmentManager
意味着片段及其视图将无法正确保存和恢复它们的状态。
它因 FragmentContainerView
而失败的原因是 FragmentContainerView
实际上与您通常所做的 FragmentTransaction
相同。