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)
我解决了这个问题如下:
@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)
通过使标签可定制,可以将同一片段的多个不同实例添加到同一片段管理器。
| 归档时间: |
|
| 查看次数: |
11740 次 |
| 最近记录: |