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)