对CharSequence的意外隐式强制转换:布局标记是TextView

时间:2018-01-19 10:49:35

标签: android textview kotlin

Android Studio显示错误

  

对CharSequence的意外隐式强制转换:布局标记为TextView

此代码

findViewById<TextView>(R.id.tv_name).text = "text"

如果我写

(findViewById<TextView>(R.id.tv_name) as TextView).text = "text"

一切都很好。

问题是为什么会这样? findViewById<TextView>是否已经有TextView类型?

4 个答案:

答案 0 :(得分:1)

您可以使用Kotlin Android Extensions

Kotlin Android Extensions是Kotlin插件,可以以惊人的无缝方式从活动,碎片和视图中恢复视图。

你可以直接使用

tv_name.text = "text"

不需要findViewById

参考 https://antonioleiva.com/kotlin-android-extensions/

答案 1 :(得分:0)

您可以使用DataBinding直接使用所有视图。更少的代码和Android的非常先进的功能。 Android DataBinding有很多文章。 https://developer.android.com/topic/libraries/data-binding/index.html

答案 2 :(得分:0)

这只是棉绒的警告。您可以使用@SuppressLint("WrongViewCast")忽略它。这是因为在Kotlin中使用Java中的泛型类型。

答案 3 :(得分:0)

首先,Kotlin在引擎盖下,只是包装了java findViewById方法。由于方法返回View,最多API 26显式转换,但现在它返回。请检查此回答No need to cast the result of findViewById?

如果您深入了解源代码,通过findViewById的调用,您将获得Window.findViewById方法,如果您在文档中查看它的描述,那么您会看到一个注释,其中说:&#34;在大多数情况下 - 根据编译器支持 - 生成的视图会自动转换为目标类类型。如果目标类类型不受约束,则可能需要显式强制转换。&#34; https://developer.android.com/reference/android/view/Window.html#findViewById(int)

我不知道&#34;不受约束的&#34;实际上意味着在这种情况下,但据我所知,在某些情况下,其他人不需要施法,所以只需处理它。例如,我试图向ImageView添加一些参数,编译器没有显示任何类型的警告:

findViewById<ImageView>(R.id.iv).adjustViewBounds = true