我有一个代码,其中调用了Lateinit变量后对其进行了初始化,但我不知道如何

问题描述

在跟进有关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就会调用该回调lambda,调用setOnClickListener不会立即调用rollDice()onCreate()方法在AppCompatActivity生命周期的早期就被调用,因此您的用户将无法在diceImage = findViewById(R.id.dice_Image)行运行之前点击按钮,因此这是完美的代码安全。

,

以下代码的代码代理实际上并未运行 root = new MyObject() { Title = some.data.property.ToString() }; . . . var repeated = root.Items.FirstOrDefault(x=>x.Title == some.data.secondProperty.ToString()); if(repeated != null){ repeated.Items.Add(new MyObject() { Title = some.data.thirdProperty.ToString()() }); } else { childItem = new MyObject() { Title = some.data.secondProperty.ToString() }; childItem.Items.Add(new MyObject() { Title = some.data.thirdProperty.ToString()(); root.Items.Add(childItem); } 方法。它仅设置侦听器,以便程序知道单击rollDice时应调用rollButton方法。

rollDice

您可以看到所有这些都在rollButton.setOnClickListener { rollDice() } 函数中,因此,就像用户只能在活动完全初始化之后,因此只能在{{ 1}}完成。