如何使用Android导航组件将值传递回之前的片段目的地? [英] how to pass a value back to previous fragment destination using Android navigation component?

本文介绍了如何使用Android导航组件将值传递回之前的片段目的地?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

坐下吧,我有一些这样的目的地

let sat I have some destinations like this

从片段A-->到片段B-->到片段C

from fragment A --> to fragment B --> to fragment C

我可以使用 Safe Args 将数据从片段 A 传递到片段 B.也可以使用从片段 B 到片段 C 的安全参数.

I can use Safe Args to pass data from fragment A to fragment B. and also using safe args from fragment B to fragment C.

如果我想将片段 C 中生成的字符串带回片段 B 或片段 A 怎么办?

what if I want to bring a string that generated in fragment C back to fragment B or to fragment A ?

从片段 C 导航到片段 B,我使用代码:

to navigate from fragment C to fragment B, I use code:

Navigation.findNavController(fragmentView).navigateUp()

为了从片段 C 导航到片段 A,我使用代码:

and to navigate from fragment C to fragment A, I use code:

Navigation.findNavController(view).popBackStack(R.id.fragmentA, false)

那么如何将值传递回之前的片段目的地?我是否必须从片段 C 返回到片段 B 并通过安全参数传递值?

so how to pass a value back to previous fragment destination ? do I have to make an action back from fragment C to fragment B and pass the value through safe args ?

真的需要你的帮助.非常感谢:)

really need your help. Thank you very much :)

推荐答案

您可以使用下面的代码片段将数据发送到上一个片段.

You can use the below snippet for sending data to previous fragment.

Fragment A 观察数据:

Fragment A observing the data:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")?.observe(viewLifecycleOwner) { data ->
        // Do something with the data.
    }
}

Fragment B 发送数据:

Fragment B sending the data:

findNavController().previousBackStackEntry?.savedStateHandle?.set("key", data)
findNavController().popBackStack()

我也为此编写了扩展程序.

I also wrote extensions for this.

fun <T : Any> Fragment.setBackStackData(key: String,data : T, doBack : Boolean = true) {
    findNavController().previousBackStackEntry?.savedStateHandle?.set(key, data)
    if(doBack)
    findNavController().popBackStack()
}

fun <T : Any> Fragment.getBackStackData(key: String, result: (T) -> (Unit)) {
    findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<T>(key)?.observe(viewLifecycleOwner) {
        result(it)
    }
}

用法:

片段 A:

getBackStackData<String>("key") { data ->
    // Do something with the data.
}

片段 B:

setBackStackData("key",data)

    

注意:我使用字符串作为数据.您可以使用任何其他类型的变量.

Note: I am using String as data. You may use any other type of variable.

注意:如果你打算使用一个类作为数据,不要忘记添加@Parcelize注解并扩展Parcelable.

Note: If you are going to use a Class as data, don't forget to add @Parcelize annotation and extend Parcelable.

这篇关于如何使用Android导航组件将值传递回之前的片段目的地?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆