检查类型时,EditText 是一个 TextView

EditText is a TextView when checking type

我正在使用这一行来检查我的应用程序中的多个视图并获取与它们关联的值,作为用户输入的值。每个其他视图(奇数)是一个文本视图,用作以下视图的标题。这些是在运行时动态创建的,因此我将 ID 收集到一个 arrayList 中以在以下循环中使用:

for(id in data.orEmpty()) {
                val mView = findViewById<View>(id)
                if (mView is TextView) {
                    Log.d("BEAU - ", "WOOT! ID number $id TextView - ${mView.text}")
                }
                if (mView is EditText) {
                    Log.d("BEAU - ", "WOOT! ID number $id EditText - ${mView.text}")
                }
                if (mView is RatingBar) {
                   Log.d("BEAU - ", "WOOT! ID number $id RatingBar - ${mView.numStars}")
                }
            }

我遇到的问题是每个 EditText 都被计为 TextView 和 EditText;所以我会有这样的东西:

D/BEAU -: WOOT! ID number 1 TextView - General EditText

D/BEAU -: WOOT! ID number 2 TextView - Hello World

D/BEAU -: WOOT! ID number 2 EditText - Hello World

但是,所有其他功能(例如评级栏)都运行良好。所以,问题是,为什么 EditText 要通过文本视图的类型检查?我可以做些什么来仅检查文本视图而不是文本视图并在第一个 if 语句中编辑文本?

编辑:

暂时,我已经能够在检查 TextView 时对照 EditText 进行检查。我这样做是这样的: if (mView is TextView && mView !is EditText) {} 但是,这样做对吗?如果是这样,我为什么要这样做?

这是因为 EditTextTextView 的子 class,所以这会给你 true -

EditText is TextView 

EditTextclass中可以看到-

class EditText extends TextView { ... }

如果合适,您可以比较 类 而不是检查类型:

when (view.javaClass) {
    TextView::class.java, AppCompatTextView::class.java -> {}
    EditText::class.java, AppCompatEditText::class.java -> {}
    RatingBar::class.java, AppCompatRatingBar::class.java -> {}
}

Yiu 需要按正确的顺序进行检查。在这种情况下,EditText 扩展了 TextView,你需要先检查它是否是 EditText,然后检查它的父级 class(如果你有更长的继承链,那么你应该从层次结构的底部向上检查 base/root class。