#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
, поэтому он даже не использует переменную lateinit4. Спасибо за вашу помощь!
Ответ №2:
Фрагмент кода ниже на самом деле не запускает rollDice
метод. Он только устанавливает прослушиватель, чтобы программа знала, что при rollButton
нажатии rollDice
на нее должен быть вызван метод.
rollButton.setOnClickListener {
rollDice()
}
Вы можете видеть, что все это onCreate
работает, так что пользователь сможет делать что-либо, например, нажимать кнопку, только после того, как действие будет полностью инициализировано, поэтому после onCreate
завершения.
Комментарии:
1.Спасибо за вашу помощь!