MaterialTextView 无法转换为 com.google.android.material.textfield.TextInputEditText

Posted

技术标签:

【中文标题】MaterialTextView 无法转换为 com.google.android.material.textfield.TextInputEditText【英文标题】:MaterialTextView cannot be cast to com.google.android.material.textfield.TextInputEditText 【发布时间】:2021-01-12 06:45:49 【问题描述】:

我意识到这是一个相当通用的错误消息,可能很简单的修复,但我错过了一些东西,可以用另一双眼睛:

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_
    android:layout_>

    <com.google.android.material.textfield.TextInputLayout
        android:layout_
        android:layout_
        android:hint="Message" >

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/message"
            android:layout_
            android:layout_ />

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

</LinearLayout>

感谢快速线索棒!

【问题讨论】:

您是否将 Kotlin Synthetics 用于您的 message 变量? 没有足够的信息,显示你如何夸大视图(如果不使用合成)。此外,您在代码中的哪个位置尝试使用之前显示的 TextInputEditText,而不是 FAB @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()

【讨论】:

它有!谢谢你一针见血,尽管我仍然不清楚为什么合成材料会在这里断裂,即使我确认我使用的是正确的。另外,我使用了以下内容而不是您提到的内容,但我不确定它是否有所作为:val dialogView = layoutInflater.inflate(R.layout.dialog_messages, null)。谢谢!

以上是关于MaterialTextView 无法转换为 com.google.android.material.textfield.TextInputEditText的主要内容,如果未能解决你的问题,请参考以下文章

System.InvalidCastException: 无法将类型为“LabelManager2.ApplicationClass”的 COM对象强制转换为

PHP:co,将int Month转换为法语字符串

如何通过 COM 类将 PPTX 转换为 PDF?

无法将 ORDER BY 命令添加到存储过程

在 C# 中为 Mysql 完成的错误转换?

如何将字符串转换为十六进制,反之亦然?