为ViewStub内登录Button设置setOnClickListener无响应问题咨询
问题修复说明
核心问题原因
你遇到的点击无响应和onStart、扩展方法位置无关,是以下两处代码逻辑错误导致:
- 扩展方法定义错误:你将
isEmpty定义为Boolean类型的扩展方法,调用逻辑完全不匹配,实际应该为可空CharSequence定义扩展 - 输入内容取值时机错误:你在
onCreate阶段就提前获取了输入框的text值,这个值是页面初始化时的静态空值,不会跟随用户后续输入更新,且判断逻辑不符合预期
具体修复方案
将你的Kotlin代码修改为如下内容即可:
class LoginViewStub : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.viewstub_login) val emailTextView = findViewById<TextInputEditText>(R.id.emailInputTextView) val passwordTextView = findViewById<TextInputEditText>(R.id.passwordTextInputView) val forgetPasswordButton = findViewById<Button>(R.id.forgotPasswordButton) val loginButton = findViewById<Button>(R.id.secondLoginButton) val cancelButton = findViewById<Button>(R.id.cancelButton) // 不要提前取输入框内容,要在点击时实时获取 loginButton.setOnClickListener { val emailText = emailTextView.text val passwordText = passwordTextView.text // 调用修正后的扩展方法 if (emailText.isEmpty() || passwordText.isEmpty()) { val dialogBuilder = AlertDialog.Builder(this) dialogBuilder.setMessage("Please fill out all fields.") .setCancelable(false) .setPositiveButton("Okay") { dialog, id -> finish() } .setNegativeButton("Cancel") { dialog, id -> dialog.cancel() } val alert = dialogBuilder.create() alert.show() } // 非空时补充你自己的登录逻辑即可 } cancelButton.setOnClickListener { } forgetPasswordButton.setOnClickListener { } } } // 修正扩展方法:给可空CharSequence写扩展,而非Boolean private fun CharSequence?.isEmpty(): Boolean { return this == null || this.length == 0 }
额外说明
你不需要将setOnClickListener逻辑移动到onStart方法中,在onCreate中设置点击监听是合理的操作,没有问题。
内容的提问来源于stack exchange,提问作者Zachary Smouse
相关产品推荐
相关产品推荐

