1

当我跟进使用 Kotlin 开发 Android 应用程序的 udacity 课程时,我发现讲师制作了一个 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 之前调用它吗?

感谢您的帮助!

4

2 回答 2

3

setOnClickListener只需注册一个回调 lambda,只要rollButton单击 ,就会调用它,调用setOnClickListener不会立即调用rollDice()。该onCreate()方法在 的生命周期的早期被调用AppCompatActivity,因此您的用户将无法diceImage = findViewById(R.id.dice_Image)在行运行之前点击按钮,因此这是非常安全的代码。

于 2020-10-05T21:21:59.240 回答
0

下面的代码片段实际上并没有运行该rollDice方法。它仅设置侦听器,以便程序知道rollButton单击rollDice时应调用方法。

rollButton.setOnClickListener {
    rollDice()
}

你可以看到这一切都是在onCreate函数中,所以就像用户只能做任何事情,比如点击一个按钮,只有在活动完全初始化之后,所以在onCreate完成之后。

于 2020-10-05T21:26:28.520 回答