无法在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
语法。
有关此主题的更多信息,请参阅此链接: – 点击这里
尝试这个:
这里bind
generics函数用来绑定视图。 它的一般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);