Kotlin值参数需类型注解问题:一键掷双骰子功能实现受阻
解决Kotlin掷两个骰子的编译错误
问题分析
你的代码存在三个关键问题导致编译报错:
dice1和dice2未声明就直接使用,编译器无法推断它们的类型,因此抛出"a type annotation is required on a value parameter"错误rollDice函数内重复调用findViewById(R.id.dice),没有利用传入的ImageView参数,无法区分两个骰子- 给按钮设置两次点击监听,后一次会覆盖前一次,点击按钮只会触发最后一个监听的逻辑
修复后的完整代码
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 先获取两个骰子的ImageView实例(需确保布局里有对应ID的控件) val dice1: ImageView = findViewById(R.id.dice1) val dice2: ImageView = findViewById(R.id.dice2) val rollButton: Button = findViewById(R.id.button) // 一个点击事件内同时处理两个骰子的投掷逻辑 rollButton.setOnClickListener { rollDice(dice1) rollDice(dice2) } } private fun rollDice(dice: ImageView) { val myDice = Dice(6) val diceRoll = myDice.roll() // 直接使用传入的dice参数操作,无需重复查找控件 dice.contentDescription = diceRoll.toString() val drawableResource = when (diceRoll) { 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 } dice.setImageResource(drawableResource) } } class Dice(private val numSides: Int) { fun roll(): Int { return (1..numSides).random() } }
关键修复说明
- 提前声明
dice1和dice2,通过findViewById绑定布局中对应的两个ImageView控件(需确保你的布局文件里有两个ID分别为dice1和dice2的ImageView) - 调整
rollDice函数逻辑,直接使用传入的dice参数设置骰子图片和描述,避免重复查找控件 - 将两个
rollDice调用合并到同一个点击监听内,确保点击按钮时同时触发两个骰子的投掷操作
内容的提问来源于stack exchange,提问作者Ali Hazem
相关产品推荐
相关产品推荐

