Android 对返回when语句感到困惑吗

Android 对返回when语句感到困惑吗,android,kotlin,Android,Kotlin,我正在浏览Google的Android codelabs构建掷骰子应用程序,我对函数getRandomDiceImage()的返回类型是Int类型感到有点困惑,但似乎该函数返回的是ImageView 我知道获取一个随机整数并将其存储在randomInt中,我还可以得到标准C语言中的switch语句。不过,把那个随机点转换成R.drawable.image让我很反感 private fun getRandomDiceImage(): Int { val randomInt = Random

我正在浏览Google的Android codelabs构建掷骰子应用程序,我对函数getRandomDiceImage()的返回类型是Int类型感到有点困惑,但似乎该函数返回的是ImageView

我知道获取一个随机整数并将其存储在randomInt中,我还可以得到标准C语言中的switch语句。不过,把那个随机点转换成R.drawable.image让我很反感

private fun getRandomDiceImage(): Int {
    val randomInt = Random().nextInt(6) + 1

    return when (randomInt) {
        1 -> R.drawable.dice_1
        2 -> R.drawable.dice_2
        3 -> R.drawable.dice_3
        4 -> R.drawable.dice_4
        5 -> R.drawable.dice_5
        else -> R.drawable.dice_6
    }

}

private fun rollDice() {
    diceImage.setImageResource(getRandomDiceImage())
    diceImage2.setImageResource(getRandomDiceImage())
}
getRandomDiceImage()的类型为Int,但函数似乎返回了ImageView

否,它返回的是
图像资源标识符
,即
@DrawableRes int
,例如
R.drawable.dice_1
等等

diceImage.setImageResource(getRandomDiceImage())


技巧在于
setImageResource(
需要
int
值(用
@DrawableRes
注释以确保它实际上是一个可绘制资源),基于此,ImageView将加载可绘制标识符所指的位图资源。

可绘制的R.drawable.dice_1的类型实际上是
Int
,而不是
ImageView
R
是一个静态类,它保存资源ID(类型为
Int
)。 您可以通过按cmd(macOS)或ctrl(Windows)并将光标放置在
dice_1
上,检查
R.drawable.dice_1
的真实值,您将看到,
public static final int dice_1=some_random_number
此some_random__是在构建过程中分配给可绘制(图像)资源的id

因此,函数
getRandomDiceImage():Int
确实返回
Int
类型。
diceImage.setImageResource(getRandomDiceImage())
确实将可绘图的id作为参数。

首先,您使用该函数根据生成的随机数确定要使用的骰子图像。请注意,when也可以用作表达式或语句

val drawableResource = when (randomInt) {
    1 -> R.drawable.dice_1
    2 -> R.drawable.dice_2
    3 -> R.drawable.dice_3
    4 -> R.drawable.dice_4
    5 -> R.drawable.dice_5
    else -> R.drawable.dice_6
}

diceImage.setImageResource(drawableResource)

需要一个
int resId
,您正在通过when表达式传递它。

不,这不是一个打字错误。
R.drawable.
都是
int
s。它们还带有
@DrawableRes
注释。这很有意义,非常感谢您的澄清!