使用导航组件safeargs将枚举作为参数传递给Fragment的正确方法是什么

时间:2018-11-29 18:36:24

标签: android android-architecture-navigation

documentation讨论了如何发送简单的整数和字符串。例如:

<argument
    android:name="myIntArg"
    android:defaultValue="255"
    app:argType="integer" />

在原始片段中:

val action = OriginFragmentDirections.myAction(myInt)
findNavController().navigate(action)

在目标片段中:

val receivedInt = DestinationFragmentArgs.fromBundle(arguments).myIntArg

但是要说不是发送myIntArg,而是要发送一个枚举(myEnumArg)。我该怎么做?我会在论点中使用什么 app:argType

2 个答案:

答案 0 :(得分:3)

正如@ianhanniballake在他的最新答案中提到的那样,您需要使用最新版本的Navigation。

假设我们有一个枚举,如下所示,并且您的应用程序包名称为com.example.app

package com.example.app.path.to.type.file

public enum class Type {
    First,
    Second,
    Third
}

现在我们只需要这样声明Arg:

<fragment
    ...>
    <argument
        android:name="type"
        android:defaultValue="Second"
        app:argType=".path.to.type.file.Type" />
...
</fragment>

答案 1 :(得分:2)

编辑:根据Navigation 1.0.0-alpha08 release notes

  

Safe Args支持可序列化的对象,包括Enum值。枚举类型可以使用不带类名的枚举文字来设置默认值(例如app:defaultValue="READ"b/111316353

因此这是可能的-您将使用Enum类的名称(即com.example.EnumClass)或相对名称(.EnumClass),这将自动在应用程序的包名称前添加类名称

上一个答案:

在当前版本的Navigation(1.0.0-alpha07)中这是不可能的,但是existing feature request被标记为固定的,并且可以在alpha08中使用枚举作为参数的功能