MaterialTextView не может быть преобразован в com.google.android.material.textfield.TextInputEditText

#android #kotlin #casting #android-textinputedittext

#Android #котлин #Кастинг #android-textinputedittext

Вопрос:

Я понимаю, что это довольно общее сообщение об ошибке с вероятным простым исправлением, но я что-то упускаю и мог бы использовать другую пару глаз:

 2020-09-25 17:09:29.006 ... E/AndroidRuntime: FATAL EXCEPTION: main
    ...
    java.lang.ClassCastException: com.google.android.material.textview.MaterialTextView cannot be cast to com.google.android.material.textfield.TextInputEditText
        at ...MessagesFragment$onViewCreated$1$$special$$inlined$apply$lambda$1.onClick(MessagesFragment.kt:171)
        at androidx.appcompat.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
  

Связанный код из моего фрагмента:

 fab.setOnClickListener {
    MaterialAlertDialogBuilder(it.context).apply {
        setView(R.layout.dialog_messages)
        setPositiveButton("Add") { dialog, which ->
            Log.d(TAG, "Message is ${message.text.toString()}!")
        }
        setNegativeButton("Remove") { dialog, which ->

        }
        setNeutralButton("Cancel", null)
    }.show()
}
  

Сбой указывает на следующую строку:

 Log.d(TAG, "Message is ${message.text.toString()}!")
  

Макет для диалога / setView:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@ id/linearLayout"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Message" >

        <com.google.android.material.textfield.TextInputEditText
            android:id="@ id/message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </com.google.android.material.textfield.TextInputLayout>

</LinearLayout>
  

Приветствуется быстрая подсказка!

Комментарии:

1. Используете ли вы синтетику Kotlin для своей message переменной?

2. Недостаточно информации, покажите, как вы раздуваете представления (если не используете синтетику). Также, где в коде вы пытаетесь использовать TextInputEditText, который вы показывали ранее, а не FAB

3. @ianhanniballake Да!

Ответ №1:

Проблема возникает из-за доступа к неправильному представлению с использованием синтетики kotlin. Действительно, message это относится к другому представлению, а не к тому, что внутри dialog_messages .

Самый простой способ — сначала раздуть представление диалогового окна, чтобы иметь доступ к содержащимся в нем представлениям (например dialogView.message.text.toString() ), а затем использовать setView(view: View) функцию вместо setView(layoutId: Int) :

 fab.setOnClickListener {
    MaterialAlertDialogBuilder(it.context).apply {
        val dialogView = LayoutInflater.from(it.context).inflate(R.layout.dialog_messages, null, false)
        setView(dialogView)

        setPositiveButton("Add") { dialog, which ->
            Log.d(TAG, "Message is ${dialogView.message.text.toString()}!")
        }
        setNegativeButton("Remove") { dialog, which ->

        }
        setNeutralButton("Cancel", null)
    }.show()
}
  

Комментарии:

1. Он имеет! Спасибо, что попали в точку, хотя мне до сих пор не ясно, почему здесь происходит синтетический сбой, даже если я подтверждаю, что использую правильный. Кроме того, я использовал следующее вместо того, что вы отметили, но я не уверен, имеет ли это значение : val dialogView = layoutInflater.inflate(R.layout.dialog_messages, null) . Спасибо!