无法在Kotlin中"findViewById".获取错误"类型推断失败"

Rav*_*aha 72 android type-inference android-layout kotlin

当我试图找到一个RecycleViewid 时,我收到以下错误.

错误: - 类型推断失败:没有足够的信息来推断参数T.

错误

码:

class FirstRecycleViewExample : AppCompatActivity() {
    val data = arrayListOf<String>()
    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
    }
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*tel 91

尝试类似的东西:

val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
Run Code Online (Sandbox Code Playgroud)

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

Kotlin Android扩展程序:

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

它是如何工作的?第一次调用时recycler_view,调用findViewById已完成并缓存.


zsm*_*b13 46

您处于API级别26,其中返回类型findViewById现在是通用的,T而不是View因此可以推断出来.您可以在此处查看相关的更改日志.

所以你应该能够做到这一点:

val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)
Run Code Online (Sandbox Code Playgroud)

或这个:

val recycler_view: RecyclerView = findViewById(R.id.recycler_view)
Run Code Online (Sandbox Code Playgroud)


Alf*_*Moh 7

通常Kotlin可以使用括号中提供的信息推断您的类型.

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

findViewById<RecyclerView>(R.id.recycler_view)
Run Code Online (Sandbox Code Playgroud)

虽然不太确定类型但是你应该如何指定它

我想补充一点,使用Anko,您可以进一步简化代码,如下所示:

val recycler_view : RecyclerView =  find(R.id.recycler_view)
Run Code Online (Sandbox Code Playgroud)


Rav*_*aha 7

Kotlin我们可以得到视图的ID不使用的 findViewById语法.

例如,我们使用以下布局,我们将获得视图的id并执行操作

布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/welcomeMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello World!"/>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下代码找到视图的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
}
Run Code Online (Sandbox Code Playgroud)

怎么样?

为了能够使用它,您需要一个特殊的导入(我在下面写的那个),但IDE能够自动导入它.不可能更容易!

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

我们需要导入此属性以获取视图的id而不使用findviewbyid语法.

有关此主题的更多信息,请参阅此链接: - 单击此处


Naj*_*ala 7

为您的代码添加此行作为无论您使用的控制器。

val tvHello = findViewById<TextView>(R.id.tvHello)
Run Code Online (Sandbox Code Playgroud)


Man*_*ore 7

无法访问像 OP 这样的 ui 组件,应用程序 gradle 内需要如下所示:

plugins {
    ...
    id 'kotlin-android-extensions'
}
Run Code Online (Sandbox Code Playgroud)

即使添加此行后,android studio 仍然无法自动解析 kotlin 合成的导入,因此您可能需要使缓存无效并重新启动。

如果仍然不起作用,则根据视图手动导入

  • 活动/片段视图:导入 kotlinx.android.synthetic.main.<your_activity_view>.*
  • 普通视图: import kotlinx.android.synthetic.main.<your_layout_view>.view.*

更新 - 2

如果您收到此信息警告 -

警告:“kotlin-android-extensions”Gradle 插件已弃用。

插件“kotlin-android-extensions”将被弃用。因此,在您的应用程序 gradle 中添加以下内容

android {
    ...
    buildFeatures {
        viewBinding true
    }
}
Run Code Online (Sandbox Code Playgroud)


Anm*_*317 5

您可以忽略为 kotlin 中的变量提供 id。你只需要使用一个插件

将其粘贴到你的 gradle 中

 apply plugin: 'kotlin-android-extensions'
Run Code Online (Sandbox Code Playgroud)

然后你不需要将 ids 分配给 var,你可以这样做

 recycler_view.setAdapter(youradapter);
Run Code Online (Sandbox Code Playgroud)