3

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

这是枚举,因为它在“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()

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

    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 中使用枚举(我的意思是,我可以通过传递一个字符串来轻松解决它并执行所需的转换,我已经在枚举本身中有一个方法,但这有点违背了使用 Safe Args 的意义,不是吗?)。

非常感谢,弗兰

4

1 回答 1

0

我不确定是什么导致了 Android Studio 的错误,但我知道如何删除该错误。

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

于 2021-12-07T12:29:53.010 回答