安卓 |导航 | OnDestroyView() 没有被调用

问题描述 投票:0回答:1

我有一个保留 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 navigation android-lifecycle fragment-oncreateview
1个回答
0
投票

听起来您在管理 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。

© www.soinside.com 2019 - 2024. All rights reserved.