简体   繁体   中英

What is the correct way to pass an Enum as an argument to a Fragment using Navigation Component safeargs

The documentation discusses how to send simple integers and strings. For example:

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

In the origin Fragment:

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

In the destination Fragment:

val receivedInt = DestinationFragmentArgs.fromBundle(arguments).myIntArg

But say instead of myIntArg , I wanted to send an enum ( myEnumArg ). How would I do that? What app:argType would I use in my argument?

Edit: As per the Navigation 1.0.0-alpha08 release notes :

Safe Args supports Serializable objects, including Enum values. Enum types can set a default value by using the enum literal without the class name (eg app:defaultValue="READ" ) b/111316353

So this is now possible - you would use the name of your Enum class (ie, com.example.EnumClass ) or a relative name ( .EnumClass ) which will automatically prepend your app's package name to the class name.

Previous answer:

This is not possible with the current version of Navigation (1.0.0-alpha07), but the existing feature request is marked as fixed and the ability to use enums as arguments will be available in alpha08

As @ianhanniballake mentioned in his updated answer, you need to use the latest version of Navigation.

Assume we have an Enum like below and your app package name is com.example.app .

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

public enum class Type {
    First,
    Second,
    Third
}

Now we just need to declare the Arg like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM