无法在Kotlin中“findViewById”。 获取错误“types推断失败”

当我尝试按ID查找RecycleView时,出现以下错误。

错误: –types推断失败:没有足够的信息来推断参数T

错误

码:

 class FirstRecycleViewExample : AppCompatActivity() { val data = arrayListOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.first_recycleview) val recycler_view = findViewById(R.id.recycler_view) as RecyclerView ///IN THIS LINE I AM GETTING THE ERROR data.add("First Data") data.add("Second Data") data.add("Third Data") data.add("Forth Data") data.add("Fifth Data") //creating our adapter val adapter = CustomRecycleAdapter(data) //now adding the adapter to recyclerview recycler_view.adapter = adapter } } 

尝试像这样:

 val recyclerView = findViewById(R.id.recycler_view) 

您也可以使用Kotlin Android Extensions 。 在这里检查文档。
有了它,你可以直接在代码中调用recycler_view

Kotlin Android扩展:

  • 在你的应用gradle.build添加apply plugin: 'kotlin-android-extensions'
  • 在你的类中添加import import kotlinx.android.synthetic.main..*其中是你的布局的文件名。
  • 就是这样,你可以直接在代码中调用recycler_view

它是如何工作的? 您第一次调用recycler_view ,将调用findViewById并进行缓存

您位于API级别26,其中findViewById的返回types现在是genericsT而不是View ,因此可以推断出来。 你可以在这里看到相关的更新日志。

所以你应该可以做到这一点:

 val recycler_view = findViewById(R.id.recycler_view) 

或这个:

 val recycler_view: RecyclerView = findViewById(R.id.recycler_view) 

通常Kotlin可以使用括号中提供的信息来推断你的types。

在这种情况下,它不能这样你就不得不像这样明确地指定它

 findViewById(R.id.recycler_view) 

虽然不太确定types,但是您应该如何指定它

我想补充一点,使用Anko ,你可以进一步简化你的代码:

 val recycler_view : RecyclerView = find(R.id.recycler_view) 

Kotlin我们可以在不使用findViewById语法的情况下获得视图的ID。

比如我们使用下面的布局,我们将得到视图的id并执行操作

布局

     

我们可以通过使用下面的代码find视图的id

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) welcomeMessage.text = "Hello Kotlin!" ////WE ARE GETTING THE IDS WITHOUT USING THE FINDVIEWBYID syntax } 

怎么样?

为了能够使用它,你需要一个特殊的导入(我在下面写的),但是IDE能够自动导入它。 不可能更简单!

 import kotlinx.android.synthetic.main.YOUR_LAYOUT_NAME.*/// HERE "YOUR_LAYOUT_NAME" IS YOUR LAYOUT NAME WHICH U HAVE INFLATED IN onCreate()/onCreateView() 

我们需要导入这个属性来获取视图的id,而不使用findviewbyid语法。

有关此主题的更多信息,请参阅此链接: – 点击这里

尝试这个:

这里bindgenerics函数用来绑定视图。 它的一般function可以用于任何视图。

 class MyActivity : AppCompatActivity() { private lateinit var recycler_view : RecyclerView override fun onCreate(savedInstanceState: Bundle?) { ... recycler_view = bind(R.id.recycler_view) } } fun  Activity.bind(@IdRes res : Int) : T { @Suppress("UNCHECKED_CAST") return findViewById(res) as T } 

无论您使用的是哪种控制器,都将代码添加到您的代码中。

 val tvHello = findViewById(R.id.tvHello) 

您可以忽略对kotlin中的variables的ID。 你只需要使用一个插件

将其粘贴到你的Gradle中

  apply plugin: 'kotlin-android-extensions' 

然后你不需要分配id到var,你可以这样做

  recycler_view.setAdapter(youradapter); 

代码:另一种方法来做到这一点。

 class KotlinActivity : AppCompatActivity() { var recycler_view: RecyclerView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_kotlin) recycler_view = findViewById(R.id.recycler_view) } } 

你甚至不需要创建一个对象来处理视图。 你可以使用这个ID。 例如, Kotlin

 recycle_view.adapter = adapter 

Java一样

 RecycleView recycle_view = (RecycleView) findViewById(recycle_view); recycle_view.setAdapter(adapter);