У меня есть код, в котором переменная lateinit была инициализирована после ее вызова, и я не знаю, как

#android #android-studio #kotlin #kotlin-lateinit

#Android #android-studio #kotlin #kotlin-lateinit

Вопрос:

Пока я изучал курс udacity по разработке приложений для Android с Kotlin, я обнаружил, что преподаватель создал переменную lateinit var diceImage: ImageView lateinit, поскольку она инициализирует ее позже, прежде чем она будет вызвана
* Переменная lateinit была вызвана в функции rollDice(), но переменная была инициализирована после вызова функции в setOnClickListner

 rollButton.setOnClickListener {
            rollDice()
        }
        diceImage = findViewById(R.id.dice_Image)
  

Вы можете найти полный код ниже

  package com.example.diceroller

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import kotlin.random.Random

class MainActivity : AppCompatActivity() {
    private var rollNumber:Int = 0
    lateinit var diceImage: ImageView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val rollButton: Button = findViewById(R.id.roll_Button)
        rollButton.setOnClickListener {
            rollDice()
        }
        diceImage = findViewById(R.id.dice_Image)
    }
    fun rollDice() {
        val diceImage: ImageView = findViewById(R.id.dice_Image)
        var randomInt: Int
        do {
           randomInt = Random.nextInt(6)   1
        } while (randomInt == rollNumber)
        rollNumber = randomInt
        when (rollNumber) {
            1 -> diceImage.setImageResource(R.drawable.dice_1)
            2 -> diceImage.setImageResource(R.drawable.dice_2)
            3 -> diceImage.setImageResource(R.drawable.dice_3)
            4 -> diceImage.setImageResource(R.drawable.dice_4)
            5 -> diceImage.setImageResource(R.drawable.dice_5)
            else -> diceImage.setImageResource(R.drawable.dice_6)
        }
    }
}
  

Поскольку я новичок в разработке Android, я не знаю, как она инициализировала ее после вызова в функции roleDice()

Кто-нибудь может прояснить это для меня? …. Разве она не должна вызываться перед setOnClickListner ?

Спасибо за помощь!

Ответ №1:

setOnClickListener просто регистрирует лямбду обратного вызова, которая будет вызываться при каждом rollButton нажатии, вызов setOnClickListener не выполняется немедленно rollDice() . onCreate() Метод вызывается очень рано в AppCompatActivity жизненном цикле, поэтому ваши пользователи не смогут нажать кнопку до запуска diceImage = findViewById(R.id.dice_Image) строки, следовательно, этот код совершенно безопасен.

Комментарии:

1. как я понял из вашего ответа, когда вызывается метод onCreate, он сначала вызывает все команды внутри него, игнорируя setOnclickListner …. я правильно понял?

2. onCreate вызовет rollButton.setOnClickListener , однако, он не будет вызывать { rollDice() } лямбду, которую вы передаете setOnClickListener — эта лямбда будет выполняться только после того, как пользователь нажмет rollButton .

3. также обратите внимание, что в rollDice() создан новый val для diceImage , поэтому он даже не использует переменную lateinit

4. Спасибо за вашу помощь!

Ответ №2:

Фрагмент кода ниже на самом деле не запускает rollDice метод. Он только устанавливает прослушиватель, чтобы программа знала, что при rollButton нажатии rollDice на нее должен быть вызван метод.

 rollButton.setOnClickListener {
    rollDice()
}
  

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

Комментарии:

1.Спасибо за вашу помощь!