检查类型时,EditText是TextView

我正在使用此行来检查我的应用程序中的许多视图,并获取与它们相关联的值(作为用户的输入)。每隔一个视图(奇数)是一个文本视图,用作以下视图的标题。这些是在运行时动态创建的,因此我将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-:哇! ID号1 TextView-常规EditText

     

D / BEAU-:哇! ID号2 TextView-Hello World

     

D / BEAU-:哇! ID号2 EditText-Hello World

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

编辑:

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

csxha0506 回答:检查类型时,EditText是TextView

Yiu需要按正确顺序安排您的cechcks。在这种情况下,随着EditText扩展TextView,您需要首先检查它是否为EditText,然后检查其父类(如果您有更长的继承链,则应从底部开始检查)直到基类/根类。

,

这是因为EditTextTextView的子类,所以这将给您true-

EditText is TextView 

EditText类中,您可以看到-

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 -> {}
}
本文链接:https://www.f2er.com/3121026.html

大家都在问