Android - 在 Kotlin 中声明和使用 View

标签 android kotlin

我正在尝试将 kotlin 用于 android 并尝试像这样声明 Linearlayout:

internal var linlay_SuccessfulPayment : LinearLayout = null!!
internal var linlay_failPayment : LinearLayout

linlay_SuccessfulPayment = findViewById(R.id.linlay_SuccessfulPayment) as LinearLayout
linlay_failPayment = findViewById(R.id.linlay_failPayment) as LinearLayout

但是在日志中我得到了这个:

Caused by: kotlin.KotlinNullPointerException
                                                                         at com.example.activities.PaymentResult.<init>(Result.kt:14)
                                                                         at java.lang.Class.newInstance(Native Method)
                                                                         at android.app.Instrumentation.newActivity(Instrumentation.java:1096)
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3122)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 
                                                                         at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:7329) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

请帮帮我。

最佳答案

您的问题在于可空性,这是使用 lateinit 关键字的好地方 (documentation) :

private lateinit var linlay_SuccessfulPayment: LinearLayout
private lateinit var linlay_failPayment: LinearLayout

通过这种方式,您可以定义一个不可为 null 的 var 但会延迟初始化,您可以在 onCreate() 中执行此操作。
您必须在访问它之前对其进行初始化,否则您将得到一个 PropertyNotInitialisedException

第二个选项是使用 property delegation 进行延迟初始化:

private var linlay_SuccessfulPayment: LinearLayout by Delegates.lazy { findViewById(R.id.linlay_SuccessfulPayment) as LinearLayout }

通过这种方式, View 仅在第一次使用时初始化,并且所有内容都集中在一个地方。

关于Android - 在 Kotlin 中声明和使用 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44261227/

相关文章:

android - 如何生成新的应用程序签名 key 并添加到 android 中的现有 keystore

kotlin - Unresolved reference :jvmName

android - 如何在不阻塞 UI 的情况下将 AsyncLayoutInflater 与 Kotlin 协程一起使用

java - Google Play服务游戏signInSilently()失败错误 'com.google.android.gms.common.api.ApiException: 4: 4 '

kotlin - 为什么无法访问的语句方法不会导致编译错误?

java - 如何在 android 中以编程方式隐藏文件夹,并访问那里的文件。

android - 如何防止 Android ImageView 与 TextView 重叠

android - 如何正确设置应用程序的名称?

android - 无法修复错误的数据库均方根刻度

android - Kotlin-在SharedPreferences上保留MutableList