我有一个保留 BottomNavigation 的活动,它使用 compose-navigation (navController) 来导航到每个选项卡和从每个选项卡导航。当我在选项卡之间导航时,它工作得很好,所有内容都被调用并工作。
问题是当我启动另一个活动(理想情况下是另一个片段的宿主)时,bottomNav 的片段的 onDestoryView() 不会被调用。
流程:启动 BottomNav Activity -> 托管 Home Fragment -> Home Fragment 打开包含 Edit Home Fragment 的新活动(其中没有 BottomNav)。
我对这种情况知之甚少,到目前为止,我已经测试过 Home Fragmnet 的 onResume() 被调用,我真正想要的是当用户从编辑 home Fragment 返回时启动 home Fragment 的 onCreateView() home 片段并使用用户在编辑 home 中更改的任何内容更新 UI。
听起来您在管理 Android 应用程序中的片段和活动的生命周期时遇到了麻烦,尤其是在使用 Jetpack Compose Navigation 中的 BottomNavigationView 和 NavController 处理导航时。
在您描述的场景中,您有一个包含 Home Fragment 的 BottomNav Activity 的设置。从 Home Fragment 中,您将启动另一个托管 Edit Home Fragment 的活动。在编辑主片段中进行更改后,您希望主片段在用户返回时反映这些更改。
第 1 步: 在 Home Fragment 中实现导航回调 在您的 Home Fragment 中,重写 onResume() 方法以检查数据是否已更改。如果有,请相应地更新您的 UI。
class HomeFragment : Fragment() {
// ...
override fun onResume() {
super.onResume()
// Check if data has changed, for example using a ViewModel
// Update UI accordingly
viewModel.checkDataChanges()
}
}
第2步:使用ViewModel在Fragment之间共享数据 在 Home Fragment 和 Edit Home Fragment 之间使用共享 ViewModel 来共享数据。当Edit Home Fragment中的数据发生变化时,更新共享的ViewModel。
class SharedViewModel : ViewModel() {
val data: MutableLiveData<Data> =
MutableLiveData()
}
class EditHomeFragment : Fragment() {
private val sharedViewModel: SharedViewModel by viewModels({ requireActivity() })
// When data changes in EditHomeFragment
private fun onDataChanged(newData: Data) {
sharedViewModel.data.value = newData
}
}
第3步:观察Home Fragment中的ViewModel数据 在您的 Home Fragment 中,观察共享 ViewModel 数据的更改。当数据发生变化时,更新您的 UI。
HomeFragment 类:Fragment() {
private val sharedViewModel: SharedViewModel by viewModels({ requireActivity() })
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Observe data changes and update UI
sharedViewModel.data.observe(viewLifecycleOwner, Observer { newData ->
// Update UI with the new data
})
}
// ...
}
通过使用共享 ViewModel,无论导航流程如何,您都可以轻松地在片段之间传达更改。当用户从 Edit Home Fragment 返回到 Home Fragment 时,将调用 onResume() 方法,您可以根据在 Edit Home Fragment 中所做的更改来更新您的 UI。