Android:当用户在导航组件、单活动应用程序中回击片段 B 时更新片段 A

Posted

技术标签:

【中文标题】Android:当用户在导航组件、单活动应用程序中回击片段 B 时更新片段 A【英文标题】:Android: Update Fragment A when user hits back on Fragment B in Navigation Component, Single activity app 【发布时间】:2021-07-20 10:53:28 【问题描述】:

我有以下要求:片段 A 显示来自 API 调用的所有推荐朋友,它调用 onCreateView。用户可以从 Fragment A -> Fragment B 导航。在 Fragment B 中,用户可以推荐新朋友。当用户推荐朋友时,我会调用 API 并触发 activity.onBackPressed() 以弹出 Back to Fragment A。

返回 Fragment A 时,我需要调用 API 以让所有推荐的朋友更新 UI。不幸的是,当我弹回时,既不调用 onCreateView() 也不调用 onResume() 或 onStart()。如何进行新的 API 调用并更新 UI?

片段 A:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
 super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(this).get(ReferAFriendViewModel::class.java)

viewModel.getRAFStatus().observe(viewLifecycleOwner,
    //UpdateUI
)

片段 B:

viewModel.postSendInvites(binding.etName.text.toString(), binding.etEmail.text.toString())

requireActivity().onBackPressed()

【问题讨论】:

您能否分享您在片段 A 中调用 API 的代码? 【参考方案1】:

你可以在你的第一个片段中使用它。

findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Type>("key")?.observe(
    viewLifecycleOwner) result ->
    // Do something with the result.

在你的第二个片段中。

findNavController().previousBackStackEntry?.savedStateHandle?.set("key", result)

我最终为它创建了两个扩展函数。

fun <T> Fragment.getCurrentBackStackEntryLiveData(key: String): MutableLiveData<T>? 
    return findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData(key)


fun <T> Fragment.setCurrentBackStackEntryLiveData(key: String, value: T) 
    findNavController().previousBackStackEntry?.savedStateHandle?.set(key, value)

这里是link 。

【讨论】:

片段 B 内的 onBackPressed() 不工作。如何使用? @ShyamalyLakhadive 你是什么意思? 此解决方案适用于 android.R.id.home。但我也想用 onBackPressed() 来实现它,因为同样的操作也应该用 onBackPressed() 来执行。

以上是关于Android:当用户在导航组件、单活动应用程序中回击片段 B 时更新片段 A的主要内容,如果未能解决你的问题,请参考以下文章

使用循环片段依赖关系模块化单活动Android应用程序

导航组件:找不到NavController

从活动向上导航到片段打开相同的片段 - Android 导航组件

Snackbar 仅在 Android 应用程序中的一项活动中显示

更新基本导航抽屉活动的参数

Android 导航组件 - 在包含的模块图之间导航