如何从撰写内部添加现有片段



我想从撰写中打开一个现有的片段,或者如果我可以全屏添加在同一撰写中,那也将起作用。以及如何从合成中从一个现有片段导航到另一个现有片段。

此处记录了我们在撰写中使用片段的建议。

具体而言,应使用可组合AndroidViewBinding来扩充包含托管要在 Compose 中使用的片段的FragmentContainerView的 XML。AndroidViewBinding具有特定于片段的处理,这就是为什么您要使用它而不是AndroidView。请注意,您需要为此启用视图绑定。

示例 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" />

然后在可组合函数中:

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

我按如下方式解决了这个问题:

@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)
}
}
}
)
}

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

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")
}
}
}
}
}

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

这对我有帮助:

@Composable
fun MyFragmentView(
fragmentManager: FragmentManager,
modifier: Modifier = Modifier
) {
AndroidView(
modifier = modifier.fillMaxSize(),
factory = { context ->
val containerId = R.id.container // some unique id
val fragmentContainerView = FragmentContainerView(context).apply {
id = containerId
}
val fragment = MyFragment()
fragmentManager.beginTransaction()
.replace(containerId, fragment, fragment.javaClass.simpleName)
.commitAllowingStateLoss()
fragmentContainerView
}
)
}

身份证.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="container" type="id"/>
</resources>

最新更新