我有一个代码,其中一个 lateinit 变量在被调用后被初始化,我不知道如何
I have a code where a lateinit variable was initialized after it was called and I don't know how
当我跟进关于 udacity 的使用 Kotlin 开发 Android 应用程序课程时,我发现讲师制作了一个 lateinit 变量 lateinit var diceImage: ImageView
因为她稍后会在它被调用之前对其进行初始化
*在rollDice()函数中调用了lateinit变量,但在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之前调用吗?
感谢您的帮助!
setOnClickListener
只是注册一个回调 lambda,只要单击 rollButton
就会调用它,调用 setOnClickListener
不会立即调用 rollDice()
。 onCreate()
方法在 AppCompatActivity
生命周期的早期被调用,因此您的用户将无法在 diceImage = findViewById(R.id.dice_Image)
行运行之前点击按钮,因此这是完美的代码安全。
下面的代码片段实际上 运行 rollDice
方法。它仅设置侦听器,以便程序知道单击 rollButton
时,应调用 rollDice
方法。
rollButton.setOnClickListener {
rollDice()
}
你可以看到这一切都在onCreate
函数中,所以就好像用户只能做任何事情,比如点击一个按钮,只有在activity完全初始化之后, 所以在 onCreate
完成后。
当我跟进关于 udacity 的使用 Kotlin 开发 Android 应用程序课程时,我发现讲师制作了一个 lateinit 变量 lateinit var diceImage: ImageView
因为她稍后会在它被调用之前对其进行初始化
*在rollDice()函数中调用了lateinit变量,但在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之前调用吗?
感谢您的帮助!
setOnClickListener
只是注册一个回调 lambda,只要单击 rollButton
就会调用它,调用 setOnClickListener
不会立即调用 rollDice()
。 onCreate()
方法在 AppCompatActivity
生命周期的早期被调用,因此您的用户将无法在 diceImage = findViewById(R.id.dice_Image)
行运行之前点击按钮,因此这是完美的代码安全。
下面的代码片段实际上 运行 rollDice
方法。它仅设置侦听器,以便程序知道单击 rollButton
时,应调用 rollDice
方法。
rollButton.setOnClickListener {
rollDice()
}
你可以看到这一切都在onCreate
函数中,所以就好像用户只能做任何事情,比如点击一个按钮,只有在activity完全初始化之后, 所以在 onCreate
完成后。