Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将数据从一个片段传输到另一个片段?_Android_Kotlin_Android Jetpack Navigation - Fatal编程技术网

Android 如何将数据从一个片段传输到另一个片段?

Android 如何将数据从一个片段传输到另一个片段?,android,kotlin,android-jetpack-navigation,Android,Kotlin,Android Jetpack Navigation,我正在Kotlin(Android Studio)上使用jetpack.navigation架构编写一个应用程序。 有两个片段:第一个包含类实例的列表,我在RecyclerView中显示,第二个用于EditText(我填写客户机数据)。我还使用Livedata和ViewModel。 问题是,当我转到第二个片段时,填写数据并确认,我转到第一个片段。据我所知,以下几行将销毁旧片段1,并创建一个新片段。第一个片段上的列表被重置为零(尽管当您旋转屏幕并最小化应用程序时列表被保存) 我找不到如何使用导航组

我正在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()
}