如何从 Compose 内部添加现有片段

And*_*ler 11 android android-jetpack-compose

我想从撰写中打开现有片段,或者如果我可以在全屏模式下添加到同一撰写中,那也可以。还介绍了如何从 compose 中的一个现有片段导航到另一个现有片段。

Chr*_*s A 15

我们对在 Compose 中使用片段的建议记录在此处

具体来说,您应该使用可组合项来扩充包含托管要在 Compose 中使用的片段的AndroidViewBindingXML 。具有特定于片段的处理,这就是为什么您要在. 请注意,您需要为此启用视图绑定。FragmentContainerViewAndroidViewBindingAndroidView

XML 文件示例:

<androidx.fragment.app.FragmentContainerView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/fragment_container_view"
  android:layout_height="match_parent"
  android:layout_width="match_parent"
  android:name="com.example.MyFragment" />
Run Code Online (Sandbox Code Playgroud)

然后在您的 Composable 函数中:

@Composable
fun FragmentInComposeExample() {
    AndroidViewBinding(MyFragmentLayoutBinding::inflate) {
        val myFragment = fragmentContainerView.getFragment<MyFragment>()
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在视图膨胀之前,我们如何在片段上设置参数包? (3认同)

Hyl*_*ron 5

我解决了这个问题如下:

@Composable
fun ReusableFragmentComponent(
    someArgumentForFragment: FragmentArgument,
    fragmentManager: FragmentManager,
    modifier: Modifier = Modifier,
    tag: String = "ReusableFragmentTag"
) {
    AndroidView(
        modifier = modifier,
        factory = { context ->
            FrameLayout(context).apply {
                id = ViewCompat.generateViewId()
            }
        },
        update = {
            val fragmentAlreadyAdded = fragmentManager.findFragmentByTag(tag) != null

            if (!fragmentAlreadyAdded) {
                fragmentManager.commit {
                    add(it.id, ReusableFragment.newInstance(someArgumentForFragment), tag)
                }
            }
        }
    )
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我从片段(由导航组件托管)中调用它,以努力使我们的可重用片段组合兼容。我这样做是这样的:

class ReusableFragments : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        return ComposeView(requireContext()).apply {
            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
            setContent {
                Column {
                    Text("ReusableFragment 1")
                    ReusableFragmentComponent(someArgument1, childFragmentManager, tag = "ReusableFragmentTag1")

                    Text("ReusableFragment 2")
                    ReusableFragmentComponent(someArgument2, childFragmentManager, tag = "ReusableFragmentTag2")
                }
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

通过使标签可定制,可以将同一片段的多个不同实例添加到同一片段管理器。