Android – объявлять и использовать представления в Котлине

Я пытаюсь использовать kotlin для android и пытаюсь объявить Linlingayout следующим образом:

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) 

Пожалуйста, помогите мне.

Использование !! оператор проверяет, имеет ли значение, к KotlinNullPointerException оно применяется, значение null , и если оно есть, оно вызывает KotlinNullPointerException ; в противном случае оно возвращает значение с типом, не имеющим значения NULL. Записывать null!! в основном throw KotlinNullPointerException(...) для throw KotlinNullPointerException(...) .

Для Android-представлений (и в других случаях, когда объект инициализируется в специальном методе init вместо конструктора), вы должны использовать ключевое слово lateinit :

 internal lateinit var linlay_SuccessfulPayment: LinearLayout internal lateinit var linlay_failPayment: LinearLayout 

Это позволяет вам иметь свойства с нулевым значением в вашей Activity которые вы не инициализируете при вызове конструктора, но только позже, в методе onCreate . Однако в этом случае вы берете на себя ответственность за инициализацию переменных перед их использованием в первый раз, иначе вы получите исключение во время выполнения.

Ваша проблема связана с nullability, и это было бы хорошим местом для использования lateinit слова lateinit (документация) :

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

Таким образом, вы определяете переменную с ненулевым значением, но задерживаете инициализацию, которую вы можете сделать в onCreate ().
Вам необходимо инициализировать его перед тем, как получить доступ к нему, или вы получите PropertyNotInitialisedException .

Второй вариант – ленивая инициализация с использованием делегирования свойств :

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

Таким образом, представление инициализируется только в первый раз, когда оно используется, и у вас есть все в одном месте.

Вы можете использовать, как показано ниже: –

  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<LinearLayout>(R.id.linlay_SuccessfulPayment) linlay_failPayment = findViewById<LinearLayout>(R.id.linlay_failPayment) 

Я только начинаю с Котлина и пытаюсь его изучить. Я связываю такие взгляды:

 var myBtn: Button = findViewById<Button>(R.id.btnMyButton) as Button 

или

 var btnLogin: Button = findViewById<Button>(R.id.btnLogin)