升级到编译SDK
版本26后,所有findViewById
显示错误:
没有足够的信息来推断参数T的乐趣 findViewById(id:Int):T!
答案 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)
因为您将java
与kotlin
混淆,使用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