android - MaterialTextView 无法转换为 com.google.android.material.textfield.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>
一个快速的线索棒表示赞赏!
解决方案
问题源于使用 kotlin 的合成访问错误的视图。确实, themessage
指的是另一种观点,而不是里面的那个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()
}
推荐阅读
- authentication - 如何获取在vaadin flow LoginForm中输入的用户名和密码?
- javascript - 如何使用 jQuery 在模态中打印 Java 对象
- android - 不定期从 Eddystone 信标获取 Android 信标库的测距更新
- vue.js - Vue2-类星体。如何将变量内容从服务器传递到浏览器
- app-store - 如果我在 AppStoreConnect 中加入了另一个组织,我可以注册为个人吗
- javascript - iframe 内的资源 URL 上下文中使用的不安全值
- json - 如何在shell脚本中循环一个jq数组结果
- sql - SQL - 具有 ID 的多行,但我想在一列中加入所有信息
- database - GreenPlum nodeLimit 的静噪条件
- javascript - 如何通过 web3 js solidity 向作者发送提示?