【问题标题】:Can I pass an array of enums with Jetpack Navigation?我可以使用 Jetpack Navigation 传递一组枚举吗?
【发布时间】:2021-02-26 13:01:30
【问题描述】:

为什么我不能使用 Jetpack Navigation 添加枚举数组参数? 我做什么:

<fragment
    android:id="@+id/my_fragment"
    android:name="com.example.MyFragment"
    android:label="fragment_my"
    tools:layout="@layout/fragment_my">

    <argument
        android:name="enums"
        app:argType="com.example.MyEnum[]" />

</fragment>

但它无法构建,因为发生了这个错误: Type mismatch: inferred type is Array&lt;MyEnum&gt; but Array&lt;(out) Parcelable!&gt;? was expected

我可以将 Kotlin 的密封类与 @Parcelize 注释一起使用,但这似乎是错误的。在这种情况下我做错了什么?

【问题讨论】:

  • 我很好奇,你真的可以在不使用导航组件的情况下实现这一点吗?您可以将枚举类型设置为片段作为参数吗?
  • @a_local_nobody 我不手动创建片段。 Jetpack 导航组件就是这样做的。答案是否定的。
  • 我根本不是在谈论导航组件,我是在问您是否创建一个片段并尝试为其设置一个枚举,这样行吗没有导航组件?因为如果没有,我会说它是有道理的 with 导航组件
  • 对,内部使用Bundle,没有putSerializableArray这样的方法。

标签: android kotlin android-architecture-navigation


【解决方案1】:

好吧,我发现这是不可能的(感谢@a_local_nobody)。 Jetpack 导航组件只是在内部使用android.os.Bundle,它没有像putSerializableArray 这样的方法。 我想出了两个解决方法:使用 Kotlin 的 sealead 类和 @Parcelize 注释,就像我在上面写的那样,发送一个 Ints 数组,然后如果需要,将它们解析为一个枚举。你可以使用它们中的任何一个,它们都很糟糕。

【讨论】:

    【解决方案2】:

    你的班级分类正确吗?应该是这样的:

    1.将以下插件导入构建 gradle 文件(应用程序):

    id 'kotlin-parcelize'
    

    2。添加@Parcelize符号并实现Parcelable

    @Parcelize                  //add annotaion
    data class MarsProperty(
        val id: String,
        val imageUrl: String,
        val type: String,
        val price: Double
    ) : Parcelable
    

    【讨论】:

    • 我实际上是想避免传递 Parcelable,因为它看起来庞大且多余。只传递一个枚举数组会容易得多。这就是我的问题所在。但回答你的问题,是的,我就是这么做的,但我不想这么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多