EditText - это TextView при проверке типа - PullRequest
1 голос
/ 12 ноября 2019

Я использую эту строку, чтобы проверить количество представлений в моем приложении и получить значения, связанные с ними, в качестве ввода пользователем. Любое другое представление (нечетное) - это текстовое представление, которое используется в качестве заголовка для следующего представления. Они создаются динамически во время выполнения, и поэтому я собрал идентификаторы в 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! Идентификационный номер 1 TextView - General EditText

D / BEAU -: WOOT! Идентификационный номер 2 TextView - Hello World

D / BEAU -: WOOT! Идентификационный номер 2 EditText - Hello World

Однако все остальные вещи (например, строка рейтинга) работают отлично. Итак, вопрос в том, почему EditText проходит проверку типа для текстового представления;и что я могу сделать, чтобы проверить только текстовые представления, а не текстовые представления и редактировать тексты в первом операторе if?

РЕДАКТИРОВАТЬ:

Временно, я 'удалось проверить с EditTexts при проверке для TextViews. Я сделал это так: if (mView is TextView && mView !is EditText) {} Но так ли это, и если да, то почему я должен делать это так?

Ответы [ 3 ]

2 голосов
/ 12 ноября 2019

Yiu нужно поставить ваши чеки в правильном порядке. В этом случае, когда EditText расширяет TextView, вам необходимо сначала проверить, является ли это EditText, а затем проверить его родительский класс (если у вас более длинная цепочка наследования, то вы должны проверить от нижней части иерархии до базовой/ корневой класс.

1 голос
/ 12 ноября 2019

Если это подходит, вы можете сравнивать классы вместо проверки типов:

when (view.javaClass) {
    TextView::class.java, AppCompatTextView::class.java -> {}
    EditText::class.java, AppCompatEditText::class.java -> {}
    RatingBar::class.java, AppCompatRatingBar::class.java -> {}
}
1 голос
/ 12 ноября 2019

Это потому, что EditText является подклассом TextView, так что это даст вам true -

EditText is TextView 

В EditText классе, который вы можете увидеть -

class EditText extends TextView { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...