升级到编译sdk版本后findViewById出错

时间:2017-06-09 15:27:06

标签: android kotlin android-8.0-oreo

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

  

没有足够的信息来推断参数T的乐趣   findViewById(id:Int):T!

4 个答案:

答案 0 :(得分: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)

如果你想知道封面下发生的事情,那么从底层方法改为

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

答案 1 :(得分:4)

在纯Java中,您将拥有例如

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

在Kotlin你可以选择

val textView = findViewById<TextView>(R.id.textview1)

答案 2 :(得分:0)

因为您将javakotlin混淆,使用android studio 3.0,您可以使用kotlin代替java语法,或者您可以同时使用这两者在Android official blog

另请阅读Get Started with Kotlin on Android

更新:功能签名 View findViewById(int id)

已升级到<T extends View>T findViewById(int id)意味着它正在应用返回类型的推理机制,其中T extends View表示View或它的子类型

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

答案 3 :(得分: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