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
相关产品推荐
相关产品推荐

