android-fragments 在合成中加载片段,它调用了几次提交

yv5phkfx  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(145)

我尝试通过supportFragmentManager在Compose中加载一个片段,如下所示。

class MainActivity : FragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            AndroidViewBinding(FragmentContainerBinding::inflate) {
                supportFragmentManager.beginTransaction()
                    .replace(container.id, MyFragment()).commit()
                }
        }
    }
}

然而,当视图显示时,片段被提交(加载)多次(即onCreate()被调用多次)
有什么方法可以防止多次提交吗?有没有方法可以恢复状态(例如,如果被系统杀死,如何恢复)?
(note:我没有像在Developer Doc中那样在XML中使用androidx.fragment.app.FragmentContainerView,我确实根据某些逻辑(此处未显示)使用了不同的片段,因此我必须使用supportFragmentManager

9cbw7uwe

9cbw7uwe1#

找到了一种方法让它工作

class MainActivity : FragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            FragmentContainer(
                modifier = Modifier.fillMaxSize(),
                fragmentManager = supportFragmentManager,
                commit = { add(it, MyFragment()) }
            )
        }
    }
}

@Composable
fun FragmentContainer(
    modifier: Modifier = Modifier,
    fragmentManager: FragmentManager,
    commit: FragmentTransaction.(containerId: Int) -> Unit
) {
    val containerId by rememberSaveable { mutableStateOf(View.generateViewId()) }

    AndroidView(
        modifier = modifier,
        factory = { context ->
            fragmentManager.findFragmentById(containerId)?.view
                ?.also { (it.parent as? ViewGroup)?.removeView(it) }
                ?: FragmentContainerView(context)
                    .apply { id = containerId }
                    .also {
                        fragmentManager.commit { commit(it.id) }
                    }
        }
    )
}

请注意,这将需要片段的KTX

implementation "androidx.fragment:fragment-ktx:1.4.1"

相关问题