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

Android问答应用问题:EditText无法禁用+分数变量不更新

解决Android问答应用的两个问题:EditText置灰失效 & 分数不更新

嘿,我来帮你搞定这两个头疼的问题!刚好我之前做类似的问答小应用时也踩过这些坑,分享一下我的解决思路~

一、EditText无法置灰禁用的解决方案

你之前尝试的setFocusable()和setEnabled()组合可能不够完整,有些设备或系统版本下,只设置其中一两个属性无法彻底禁用EditText并让它视觉上置灰。正确的做法是同时设置以下几个属性,再配合文字颜色调整:

Kotlin代码示例:

// 假设你的EditText实例叫answerEt
answerEt.isEnabled = false
answerEt.isFocusable = false
answerEt.isFocusableInTouchMode = false
// 设置文字为灰色,让视觉上明确显示已禁用
answerEt.setTextColor(ContextCompat.getColor(this, R.color.grey))

Java代码示例:

EditText answerEt = findViewById(R.id.answer_et);
answerEt.setEnabled(false);
answerEt.setFocusable(false);
answerEt.setFocusableInTouchMode(false);
answerEt.setTextColor(ContextCompat.getColor(this, R.color.grey));

为什么要这么做?

  • isEnabled = false:禁止EditText的交互能力(不能输入、点击)
  • isFocusable和isFocusableInTouchMode:防止EditText获取焦点,彻底阻断用户的输入操作
  • setTextColor:很多时候EditText禁用后文字颜色不会自动变灰,手动设置能让用户直观看到控件已不可用

二、分数变量无法更新的排查与解决

分数不更新通常是变量作用域问题或得分计算逻辑没执行导致的,你可以从这几个方向排查:

1. 确保分数是类成员变量,而非局部变量

如果你的分数变量是在按钮点击方法里定义的局部变量,每次调用方法都会重新初始化,自然无法累计或更新。要把它定义为类的成员变量:

Kotlin:

class QuizActivity : AppCompatActivity() {
    // 定义为类成员变量,整个Activity生命周期内都能访问
    private var userScore = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_quiz)
        // ... 其他初始化代码
    }
}

Java:

public class QuizActivity extends AppCompatActivity {
    private int userScore = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        // ... 其他初始化代码
    }
}

2. 检查得分计算逻辑的执行时机与正确性

  • 时机:应该在用户提交答案(触发控件禁用的操作)时就计算得分,或者在点击评分按钮时重新计算所有题目(避免之前的计算遗漏)
  • 正确性:比如EditText的内容判断要记得trim(),去掉前后空格;复选框要判断所有正确选项是否都被选中、错误选项是否未被选中

示例:点击评分按钮时重新计算得分:

scoreBtn.setOnClickListener {
    userScore = 0 // 先重置分数,避免多次点击累加错误
    // 1. 单选题得分判断
    if (correctRadioBtn.isChecked) {
        userScore += 33
    }
    // 2. EditText题目得分判断
    if (answerEt.text.toString().trim().equals("正确答案内容", ignoreCase = true)) {
        userScore += 33
    }
    // 3. 多选题得分判断(假设正确选项是check1和check3)
    if (check1.isChecked && check3.isChecked && !check2.isChecked) {
        userScore += 34 // 凑满100分
    }
    // 弹出Toast显示分数
    val toastMsg = if (userScore >= 60) "你的得分:$userScore 分!表现不错~" else "你的得分:$userScore 分!继续加油哦~"
    Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show()
}

3. 确认变量更新后没有被意外重置

检查代码中有没有其他地方不小心把userScore重新赋值为0,比如在控件禁用的方法里误写了重置逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:08:36