尝试传递在此类片段类中定义的枚举类型的参数时,我在这里遇到了安全参数的一个奇怪问题。一些代码,用于澄清。
这是枚举,因为它在“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 的意义,不是吗?)。
非常感谢,弗兰