升级编译SDK版本后,findViewById出现错误

8

在升级编译SDK版本到26之后,所有的findViewById都显示错误:

没有足够的信息来推断函数中的参数T,请检查fun findViewById(id: Int): T!。

4个回答

15
这是因为从Android O开始,我们不需要进行类型转换。有几个选择。替换为:
val textInput = findViewById(R.id.edit_text) as TextInputLayout

使用以下任一方法:

val textInput:TextInputLayout = findViewById(R.id.edit_text)

或者:

val textInput = findViewById<TextInputLayout>(R.id.edit_text)

如果你想了解背后发生了什么,从O版本开始,底层方法已更改为

public <T extends View> T findViewById(@IdRes int id) {
    return this.getDelegate().findViewById(id);
}

4

在纯Java中,例如,您将拥有

TextView textView = findViewById(R.id.textview1);

在 Kotlin 中,你可以使用以下方式:
val textView = findViewById<TextView>(R.id.textview1)

0

这是 Kotlin 中的某种类型错误,请修复它

val result = findViewById <TextView>(R.id.textView_result) as TextView
val button_sum = findViewById<Button>(R.id.button_sum) as Button
val editText_i1 = findViewById<EditText>(R.id.editText_i1) as EditText

奇怪的“<TextView>”会导致错误,而“as TextView”则可以解决这个问题。淘气的安卓系统。 - Abhijeet Prusty

0

由于您混淆了javakotlin,在Android Studio 3.0中,您可以使用kotlin语法代替java语法,或者像Android官方博客中提到的那样两者都可以使用。

还可以阅读有关在Android上开始使用Kotlin的文章。

更新:函数签名View findViewById(int id)

已升级为<T extends View>T findViewById(int id),这意味着它应用了返回类型的推断机制,其中T extends View表示View或其子类型。

注意:正如最初提到的那样,应用强制转换仍不会生成任何错误,但只会产生一个lint警告,因为使用不必要的强制转换可能是kotlin类型推断中的一个错误,但不是在java中。


1
我应该澄清一下,这个问题是针对Kotlin项目的。在Android O中,底层的findViewById方法已经改变,因此我们不再需要进行强制转换。在Java中,我们也不再需要进行强制转换。 - bond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接