android - 尽管初始化,对象在 Kotlin 中仍处于未初始化状态
问题描述
我正在我的方法中初始化我的RecyclerView
对象,但不知何故它没有通过。我正在使用该函数来初始化我的对象并附加其必要的属性:MainActivity.kt
onCrete()
apply
RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
adapter = EntryAdapter()
layoutManager = LinearLayoutManager(this)
recyclerView.apply{
findViewById<RecyclerView>(R.id.userpass_recyclerview)
layoutManager = layoutManager
adapter = adapter
}
...
}
这是我得到的错误:
Process: com.example.cryptpass_kt, PID: 29095
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.cryptpass_kt/com.example.cryptpass_kt.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property recyclerView has not been initialized
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2853)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2928)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1609)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6703)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property recyclerView has not been initialized
at com.example.cryptpass_kt.MainActivity.onCreate(MainActivity.kt:46)
at android.app.Activity.performCreate(Activity.java:6980)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2806
解决方案
调用apply
(与任何其他方法一样)方法需要已经初始化的对象。但是您正试图在apply
的 lambda 中对其进行初始化。
所以你需要先打电话findViewById
:
recyclerView = findViewById<RecyclerView>(R.id.userpass_recyclerview)
recyclerView.apply {...}
或者,要获得更少的代码:
recyclerView = findViewById<RecyclerView>(R.id.userpass_recyclerview).apply {
...
}
并且不要忘记,您应该findViewById
只在setContentView
.
推荐阅读
- amazon-web-services - 将 cloudwatch 流日志实时移动到 Redshift
- apache-spark - Spark AccumulatorV2 与 HashMap
- r - R 条件计算和组内的行标志
- c# - 在数组中元素的递减序列中找到最高和
- php - 当 var_dump 变量 ...im 得到 NULL 时输出
- php - 如何根据数字范围获取(固定)值
- javascript - index.html 中的 JS 函数在 Angular 中只执行了一次
- eclipse - Eclipse:包含的功能未显示
- restsharp - 使用 RestSharp 进行 NTLM 身份验证
- django - /api/list/ 'NoneType' 对象的 AttributeError 没有属性 'delete'