我正在重写我的简单UI应用程序以使用导航架构组件,我需要传递一个实现Parcelable的Pojo,还没有看到任何关于如何做到这一点的文档。
任何帮助都将不胜感激。
答案 0 :(得分:18)
自safe-args-gradle-plugin:1.0.0-alpha03
起,您可以使用Parcelable
对象使用其完全限定的类名:
app:argType="com.example.app.model.Item"
现在支持可拆分参数,对app:type使用完全限定的类名。支持的唯一默认值为“ @null”(https://issuetracker.google.com/issues/79563966)
答案 1 :(得分:6)
现在你不能使用除整数,字符串,推断和引用之外的类型的安全args >,有一个issue已开启,要求其他类型。
现在可以做的是在使用 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")
答案 2 :(得分:2)
我知道答案已经存在,但这可能会对某人有所帮助。 Code snippet
在build.gradle中添加此依赖项
ext{
...
navigation_version = '1.0.0-alpha11'
}
dependencies {
...
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:$navigation_version"
}
在app / build.gradle中
apply plugin: 'androidx.navigation.safeargs'
...
在导航图中
<fragment
android:id="@+id/source_fragment_id"
android:name="app.test.SourceFragment"
android:label="@string/source_fragment_label"
tools:layout="@layout/source_fragment_layout">
<action
android:id="@+id/action_source_fragment_to_destination_fragment"
app:destination="@id/destination_fragment_id"
...
/>
</fragment>
<fragment
android:id="@+id/destination_fragment_id"
android:name="app.test.DestinationFragment"
android:label="@string/destination_fragment_label"
tools:layout="@layout/destination_fragment_layout">
<argument
android:name="variableName"
app:argType="app.test.data.model.CustomModel" />
...
</fragment>
注意:CustomModel应该是可打包的或可序列化的。
从SourceFragment导航到这个DestinationFragment时
val direction = SourceFragmentDirections.ActionSourceFragmentToDestinationFragment(customModel)
findNavController().navigate(direction)
现在从DestinationFragment中的包中检索值
...
import app.test.DestinationFragmentArgs.fromBundle
class DestinationFragment : Fragment() {
val variableName by lazy {
fromBundle(arguments!!).variableName
}
...
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
Log.e(DESTINATION_FRAGMENT_TAG,"onCreateView")
//Can use CustomModel variable here i.e. variableName
}
}
答案 3 :(得分:0)
您可以使用boolean
,reference
,integer
,long
,string
,enum
,parcelable
甚至{ {1}}。但是忘了最后一个;-)
最好使用最新的插件版本serializable
并指定完全合格的类名:
safe-args-gradle-plugin:1.0.0-alpha08
来自您的
<fragment
...>
<argument
android:name="data"
app:argType="com.example.ParcelableData" />
</fragment>
您可以发送所有package com.example
data class ParcelableData(val content: String) : Parcelable { ... }
的数组:
argType