【问题标题】:Android Safe Args, nav_graph and enums error: Comparison of incompatible enums is always unsuccessfulAndroid Safe Args, nav_graph and enums error: 比较不兼容的枚举总是不成功
【发布时间】:2021-09-29 13:17:51
【问题描述】:

我在尝试传递在此类片段类中定义的枚举类型的参数时,我在 Safe Args 遇到了一个奇怪的问题。一些代码,为了澄清。

这是枚举,因为它在“EvaluationFragment”kotlin 类中定义:

    enum class EnrollmentOutcome(vararg labels: String) {
        Accepted("AUTO_APPROVED"), Rejected("AUTO_DECLINED"), Reviewing("REVIEW_REQUIRED"), Unknown(
            "UNAVAILABLE"
        );

        private val outcomeLabels: MutableList<String> = ArrayList()

        companion object {
            fun fromString(label: String): EnrollmentOutcome {
                return when {
                    Accepted.outcomeLabels.contains(label) -> {
                        Accepted
                    }
                    Rejected.outcomeLabels.contains(label) -> {
                        Rejected
                    }
                    Reviewing.outcomeLabels.contains(label) -> {
                        Reviewing
                    }
                    else -> {
                        Unknown
                    }
                }
            }
        }

        init {
            outcomeLabels.addAll(listOf(*labels))
        }
    }

这是 nav_graph.xml 文件中定义的相关片段条目:

    <fragment
        android:id="@+id/evaluationFragment"
        android:name="com.whatever.domain.EvaluationFragment"
        android:label="fragment_evaluation"
        tools:layout="@layout/fragment_evaluation" >
        <argument
            android:name="outcome"
            app:argType="com.whatever.domain.EvaluationFragment$EnrollmentOutcome"
            android:defaultValue="Unknown" />
    </fragment>

然后我在 EvaluationFragment 类中将其作为私有字段:

private val args: EvaluationFragmentArgs by navArgs()

而且 this 也在此类的方法中,这就是发生错误的地方:

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        when (args.outcome) {
            EnrollmentOutcome.Accepted -> {
                outcomeTitle.setText(R.string.registration_accepted)
                outcomeIcon.setImageDrawable(
                    ContextCompat.getDrawable(
                        requireContext(),
                        R.drawable.ic_check_circle_green_48dp
                    )
                )
                outcomeDescription.setText(R.string.registration_description_accepted)
            }
            EnrollmentOutcome.Rejected -> {
                outcomeTitle.setText(R.string.registration_declined)
                outcomeDescription.setText(R.string.registration_description_declined)
                outcomeIcon.setImageDrawable(
                    ContextCompat.getDrawable(
                        requireContext(),
                        R.drawable.ic_error_red_48dp
                    )
                )
            }
            EnrollmentOutcome.Reviewing -> {
                outcomeTitle.setText(R.string.registration_reviewing)
                outcomeDescription.setText(R.string.registration_description_reviewing)
                outcomeIcon.setImageDrawable(
                    ContextCompat.getDrawable(
                        requireContext(),
                        R.drawable.ic_info_blue_48dp
                    )
                )
            }
            EnrollmentOutcome.Unknown -> {
                outcomeTitle.setText(R.string.registration_error)
                outcomeDescription.setText(R.string.registration_description_error)
                outcomeIcon.setImageDrawable(
                    ContextCompat.getDrawable(
                        requireContext(), R.drawable.ic_error_red_48dp
                    )
                )
            }
        }
    }

现在的问题是,在每个分支中,枚举项都被 Android Studio 用红色下划线并显示此错误:

比较不兼容的枚举 '[ERROR : com.whatever.domain.EvaluationFragment$EnrollmentOutcome]' 和 'EvaluationFragment.EnrollmentOutcome' 总是不成功

尽管如此,代码不仅构建得非常好,而且完全符合预期。

无论如何,我想知道 为什么 Android Studio 会在那里抛出错误,以及我如何才能摆脱它并仍然在安全 args 中使用枚举(我的意思是,我可以解决它很容易通过传递一个字符串并进行所需的转换,我已经在枚举本身中有一个方法,但这有点违背了使用安全参数的意义,不是吗?)。

提前非常感谢, 弗兰

【问题讨论】:

    标签: android kotlin enums android-safe-args


    【解决方案1】:

    我不确定是什么导致 Android Studio 出现该错误,但我知道如何消除该错误。

    在您的 nav_graph.xml 中,您将 argType 设置为类中的枚举。如果您将枚举移出类,然后更改 argType 以匹配它被移动到的位置(只需使用 $ 删除类名),那么它就没有问题了

    【讨论】:

    • 谢谢詹姆斯,我会尽力确认。无论如何,这显然是 AS 中的一个错误,因为它还应该能够处理嵌套枚举,这很常见且很方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2010-12-17
    • 2012-05-04
    相关资源
    最近更新 更多