Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.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 如何使用导航类型safeargs插件将Parcelable类型的对象传递给片段_Android_Android Fragments_Android Architecture Components_Android Jetpack - Fatal编程技术网

Android 如何使用导航类型safeargs插件将Parcelable类型的对象传递给片段

Android 如何使用导航类型safeargs插件将Parcelable类型的对象传递给片段,android,android-fragments,android-architecture-components,android-jetpack,Android,Android Fragments,Android Architecture Components,Android Jetpack,我正在重写我的简单UI应用程序以使用导航架构组件,我需要通过一个实现Parcelable的Pojo,我还没有看到任何关于如何做到这一点的文档 如果有任何帮助,我们将不胜感激。现在,除了整数、字符串、推断和引用之外,您不能将安全参数与其他类型一起使用,有一个打开的请求其他类型 现在可以做的是,在使用navigate()方法导航到目标时,通常会传递一个包: var bundle = bundleOf("amount" to amount) view.findNavController().navig

我正在重写我的简单UI应用程序以使用导航架构组件,我需要通过一个实现Parcelable的Pojo,我还没有看到任何关于如何做到这一点的文档


如果有任何帮助,我们将不胜感激。

现在,除了整数、字符串、推断和引用之外,您不能将安全参数与其他类型一起使用,有一个打开的请求其他类型

现在可以做的是,在使用navigate()方法导航到目标时,通常会传递一个包:

var bundle = bundleOf("amount" to amount)
view.findNavController().navigate(R.id.confirmationAction, bundle)
您可以使用常用的
getArguments
(或kotlin中的参数)检索:

val tv = view.findViewById(R.id.textViewAmount)
tv.text = arguments.getString("amount")

由于
safe-args-gradle-plugin:1.0.0-alpha03
您可以使用
Parcelable
对象的完全限定类名:

<argument
    android:name="item"
    app:argType="com.example.app.model.Item"/>

资料来源:



要支持可空性,必须将
android:defaultValue=“@null”
app:nullable=“true”
一起使用
boolean
reference
integer
long
字符串
枚举
可打包
,甚至
可序列化
。但是忘记最后一个;-)

最好使用最新的插件版本
safe-args-gradle-plugin:1.0.0-alpha08
,并指定完全限定的类名:

<fragment
    ...>
    <argument
        android:name="data"
        app:argType="com.example.ParcelableData" />
</fragment>
您可以发送所有
argType
s的数组:

<argument
        android:name="data"
        app:argType="string[]" />

我知道答案已经在那里了,但这可能会对某些人有所帮助<代码>代码片段

在build.gradle中添加此依赖性

ext{
...
导航_版本='1.0.0-alpha11'
}
依赖关系{
...
classpath“android.arch.navigation:navigation-safe-args-gradle插件:$navigation\u版本”
}
应用程序内/build.gradle

apply插件:'androidx.navigation.safeargs'
...
在导航图中


...
注意:CustomModel应该是可打包或可序列化的

从SourceFragment导航到此DestinationFragment时

val direction=SourceFragmentDirections.ActionSourceFragmentToDestinationFragment(customModel)
findNavController()。导航(方向)
现在从DestinationFragment中的bundle中检索值

。。。
导入app.test.DestinationFragmentArgs.fromBundle
类DestinationFragment:Fragment(){
val variableName由lazy命名{
fromBundle(参数!!).variableName
}
...
覆盖创建视图(充气机:布局充气机,容器:ViewGroup?,savedInstanceState:Bundle?):视图{
Log.e(目的地\u片段\u标记,“onCreateView”)
//可以在此处使用CustomModel变量,即variableName
}
}

您是否在@Po10cio成功实现了这一点?没有,但目前导航体系结构组件添加了可包裹参数。bundleOf来自哪里?是的,没错。它曾经是jetbrains插件的内部版本,但后来被弃用,取而代之的是ktx One。看起来上述问题在2018年7月10日已经解决。“已添加包裹支持,alpha03中也将提供包裹支持。”如何在Proguard中使用此功能?我遇到了一个崩溃:`由以下原因引起:` java.lang.RuntimeException:java.lang.ClassNotFoundException:com.example.models.User`@PatrickSteiger您需要使用
-keep class className
规则保留此类类。这似乎不适用于嵌套类<例如,code>com.example.app.TestFragment.ViewModel将不起作用。有人找到了解决方法吗?可能是
TestFragment$ViewModel
I love you@EpicPandaForce,works!我将在这里添加一些关键字,以便人们能够更快地找到它:argtype parcelable classnotfoundexception dex我应该在导航图中为“android:defaultValue”设置什么?它在没有默认值的情况下崩溃。我找到了答案,您也必须添加“android:defaultValue=“@null”。@ParisaBaastani它不是一个必填字段,理想情况下不应该崩溃。您使用的是哪个导航组件版本?我使用的是2.3.2版本,我记得它会抛出没有默认值的异常。
<argument
        android:name="data"
        app:argType="string[]" />