Android – 在Kotlin中声明和使用视图
我正在尝试使用android的kotlin,并尝试像这样声明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.(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)
请帮我一下
使用!!
运算符检查应用的值是否为null
,如果是,则抛出KotlinNullPointerException
; 否则返回一个不可为空的types的值。 写下null!!
基本上是throw KotlinNullPointerException(...)
简写。
对于Android Views(以及在特殊的init方法而不是构造函数中初始化对象的其他情况),应使用lateinit
关键字:
internal lateinit var linlay_SuccessfulPayment: LinearLayout internal lateinit var linlay_failPayment: LinearLayout
这可以让您在Activity
中拥有不可空的属性,而在调用构造函数时不会进行初始化,而只能在onCreate
方法中进行初始化。 但是,在这种情况下,在第一次使用它们之前,首先要负责初始化variables,否则在运行时会得到一个exception。
你的问题是可空性,这将是一个使用lateinit
关键字(文档)的好地方:
private lateinit var linlay_SuccessfulPayment: LinearLayout private lateinit var linlay_failPayment: LinearLayout
这样你可以定义一个不可为空的var,但是可以延迟初始化,你可以在onCreate()中做这个。
在访问它之前,你必须初始化它,否则你会得到一个PropertyNotInitialisedException
。
第二个选项是使用属性委托进行延迟初始化:
private var linlay_SuccessfulPayment: LinearLayout by Delegates.lazy { findViewById(R.id.linlay_SuccessfulPayment) as LinearLayout }
这样,视图仅在第一次使用时才被初始化,并且您将所有内容都放在一个地方。
我刚刚开始与Kotlin并试图学习它。 我像这样绑定视图:
var myBtn: Button = findViewById
要么
var btnLogin: Button = findViewById
你可以使用如下:
var linlay_SuccessfulPayment : LinearLayout? = null var linlay_failPayment : LinearLayout? = null linlay_SuccessfulPayment = findViewById(R.id.linlay_SuccessfulPayment) as LinearLayout linlay_failPayment = findViewById(R.id.linlay_failPayment) as LinearLayout
初始化如下
internal var linlay_SuccessfulPayment : LinearLayout ?= null internal var linlay_failPayment : LinearLayout ?= null
并像下面一样使用它
linlay_SuccessfulPayment = findViewById(R.id.linlay_SuccessfulPayment) linlay_failPayment = findViewById (R.id.linlay_failPayment)