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

Kotlin开发OTP验证时setOnClickListener的else分支不生效求助

问题原因

你的代码问题出在输入框内容的读取时机错误:
你在onCreate生命周期回调里就直接读取了4个EditText的text值并转成字符串存储,此时页面刚完成渲染,输入框还没有被用户输入内容,所以你存的inputCode1到inputCode4四个变量永远都是初始的空字符串,哪怕后面用户输入了内容,这几个变量的值也不会自动更新。你点击按钮时判断的一直是初始的空值,所以永远会触发空校验的Toast。

修复方案

把读取输入框内容的逻辑挪到按钮点击事件的内部,每次点击按钮时再实时读取当前输入框的内容即可,修复后的代码如下:

class GetOTP : AppCompatActivity() { // 提示:类名建议遵循大驼峰命名规范,把getOTP改成GetOTP更符合Kotlin开发规范
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_get_otp)
    
        // 只在onCreate里初始化控件引用,不要提前读取输入内容
        val inputCode1 = findViewById<EditText>(R.id.inputCode1)
        val inputCode2 = findViewById<EditText>(R.id.inputCode2)
        val inputCode3 = findViewById<EditText>(R.id.inputCode3)
        val inputCode4 = findViewById<EditText>(R.id.inputCode4)
    
        val verifyOTPButtonOne = findViewById<Button>(R.id.verifyOTPButtonOne)
        verifyOTPButtonOne.setOnClickListener {
            // 点击按钮时再实时读取当前输入框的最新内容
            val code1 = inputCode1.text.toString()
            val code2 = inputCode2.text.toString()
            val code3 = inputCode3.text.toString()
            val code4 = inputCode4.text.toString()
            if(code1.isEmpty() || code2.isEmpty() || code3.isEmpty() || code4.isEmpty()){
                Toast.makeText(applicationContext,"请输入正确的OTP",Toast.LENGTH_SHORT).show()
             }
             else {
                 val intent = Intent(this, VerifySuccess::class.java)
                 startActivity(intent)
             }
         }
    }
}
可选优化点
  • 给输入框添加android:inputType="number"属性,限制只能输入数字,避免用户输入无效字符
  • 给四个输入框添加输入自动跳位逻辑,输完第一个输入框的内容后自动聚焦到第二个输入框,提升使用体验

内容的提问来源于stack exchange,提问作者harsh.rupapara141

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:12:04