Android 如何将数据从一个片段传输到另一个片段?
我正在Kotlin(Android Studio)上使用jetpack.navigation架构编写一个应用程序。 有两个片段:第一个包含类实例的列表,我在RecyclerView中显示,第二个用于EditText(我填写客户机数据)。我还使用Livedata和ViewModel。 问题是,当我转到第二个片段时,填写数据并确认,我转到第一个片段。据我所知,以下几行将销毁旧片段1,并创建一个新片段。第一个片段上的列表被重置为零(尽管当您旋转屏幕并最小化应用程序时列表被保存)Android 如何将数据从一个片段传输到另一个片段?,android,kotlin,android-jetpack-navigation,Android,Kotlin,Android Jetpack Navigation,我正在Kotlin(Android Studio)上使用jetpack.navigation架构编写一个应用程序。 有两个片段:第一个包含类实例的列表,我在RecyclerView中显示,第二个用于EditText(我填写客户机数据)。我还使用Livedata和ViewModel。 问题是,当我转到第二个片段时,填写数据并确认,我转到第一个片段。据我所知,以下几行将销毁旧片段1,并创建一个新片段。第一个片段上的列表被重置为零(尽管当您旋转屏幕并最小化应用程序时列表被保存) 我找不到如何使用导航组
我找不到如何使用导航组件解决问题。我将非常感激。要使用jetpack导航在两个片段之间传递数据,您必须使用 像这样传递参数节
<fragment android:id="@+id/myFragment" >
<argument
android:name="myArg"
app:argType="integer"
android:defaultValue="0" />
</fragment>
并将其作为
val args: ConfirmationFragmentArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val tv: TextView = view.findViewById(R.id.textViewAmount)
val amount = args.amount
tv.text = amount.toString()
}
但是,safeargs仅适用于基本类型,因此,如果您试图传递对象,则必须解构和重建当您使用
ViewModel
s时,我建议您使用共享ViewModel。其工作方式是,同一活动中的多个片段可以访问同一个ViewModel实例
有一个非常适合您的用例的方法。它展示了如何使用共享视图模型,通过主细节导航模式和LiveData
实现这一点。我建议你去看看
为什么不在这里使用安全参数:您可以尝试使用安全参数来实现您想要实现的目标,但我强烈建议您不要这样做:您必须以某种方式使用安全参数在片段之间来回传递您的
客户机
对象(这意味着单独发送每个字段或绑定)而且你必须手动更新你的LiveData
对象-这违背了LiveData的目的。使用共享的ViewModel
,你不必担心这些。不需要来回发送数据,不需要将你的Client
对象拆开或捆绑,也不需要手动更新LiveData
对象-你可以只需通过您的ViewModel
从两个片段访问相同的LiveData
实例,现在我明白了,非常感谢。但是在片段之间传输对象的正确方法是什么。传输对象的正确方法是实现可打包和捆绑。要记住的是传输到不同片段如果答案有助于你确保接受它,也可以通过活动完成。:)
override fun onClick(v: View) {
val amountTv: EditText = view!!.findViewById(R.id.editTextAmount)
val amount = amountTv.text.toString().toInt()
val action = SpecifyAmountFragmentDirections.confirmationAction(amount)
v.findNavController().navigate(action)
}
val args: ConfirmationFragmentArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val tv: TextView = view.findViewById(R.id.textViewAmount)
val amount = args.amount
tv.text = amount.toString()
}