在一个`Fragment`中,是否可以填充包含`FragmentContainerView`的视图?

3

我试图膨胀一个包含FragmentContainerView的视图,该视图在被放入布局中的fragment中。

  • 根视图
    • 片段
      • 自定义视图
        • 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>

但是当我执行代码时,我的应用程序崩溃了:

导致错误的原因:java.lang.IllegalStateException: FragmentManager已经在执行事务


在使用FragmentContainerView时,如何避免此错误(注意:如果我使用<fragment>而不是<androidx.fragment.app.FragmentContainerView>,一切都正常)

1个回答

5

在嵌套片段时,应始终使用childFragmentManager - 当其父项正在经历生命周期更改(我假设您在调用事务时)时,childFragmentManager永远不执行事务。

实际上,当您使用<fragment>标签时,这实际上会给您带来问题,因为这些生命周期事件实际上并不作为事务发生,而是直接作为膨胀的一部分。使用错误的FragmentManager意味着片段及其视图将无法正确保存和恢复其状态。

它在使用FragmentContainerView失败的原因是FragmentContainerView实际上与通常执行的FragmentTransaction相同。


嗨,@ianhanniballake。感谢您的回复。我将尝试通过手动添加嵌套的 nav_graph 片段来实现。干杯 \o/(附言:当在片段之间切换时,我遇到的一个问题可能是由于您指出的问题[悄悄地引起了问题]。感谢您提供的信息) - Augusto Carmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接