You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android双骰子App点击按钮仅显示第二个掷骰结果问题求助

问题根因

你对同一个按钮连续调用了两次setOnClickListener,Android控件的点击监听器是覆盖式赋值的,只有最后一次绑定的回调会生效,之前绑定的rollDice()逻辑会被直接覆盖,点击按钮时只会执行rollDice2(),自然只能看到第二个骰子的结果。
另外你额外定义的Dice2类、roll2()方法是完全冗余的,和原有Dice类的逻辑100%重复,直接复用原有类创建新实例即可。

修复步骤
  • 移除重复的监听器绑定,只给按钮设置一次点击回调,在回调内部同时执行两个骰子的掷点逻辑
  • 删除冗余的Dice2类,第二个骰子直接复用Dice类生成实例

修正后的可运行代码:

package com.example.diceroller

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val rollButton: Button = findViewById(R.id.button)
        rollButton.setOnClickListener {
            rollDice()
            rollDice2()
        }
    }

    private fun rollDice() {
        val dice = Dice(6)
        val diceRoll = dice.roll()
        val resultTextView: TextView = findViewById(R.id.textView)
        resultTextView.text = diceRoll.toString()
    }

    private fun rollDice2() {
        val dice2 = Dice(6)
        val diceRoll2 = dice2.roll()
        val resultTextView: TextView = findViewById(R.id.textView2)
        resultTextView.text = diceRoll2.toString()
    }
}

class Dice(private val numSides: Int) {
    fun roll(): Int {
        return (1..numSides).random()
    }
}
可选优化
  • 把findViewById的操作挪到onCreate生命周期里执行一次即可,不需要每次点击掷骰子都重新查找控件,减少无意义的性能开销
  • 后续如果需要增加更多骰子,直接新建Dice实例即可,不需要新增重复的类和方法

内容的提问来源于stack exchange,提问作者McGreggles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:54:52