Android 对返回when语句感到困惑吗
我正在浏览Google的Android codelabs构建掷骰子应用程序,我对函数getRandomDiceImage()的返回类型是Int类型感到有点困惑,但似乎该函数返回的是ImageView 我知道获取一个随机整数并将其存储在randomInt中,我还可以得到标准C语言中的switch语句。不过,把那个随机点转换成R.drawable.image让我很反感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
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
注释。这很有意义,非常感谢您的澄清!