如何在TextWatcher检测到输入长度为4时向其他类触发回调通知
实现方案
步骤1:为PIN输入类添加回调参数
首先修改GenericTextEnterPinPassword类的构造函数,增加回调参数,用于通知PIN输入完成事件:
// 定义回调接口,也可以直接使用Kotlin函数类型简化 fun interface OnPinCompleteListener { fun onPinInputCompleted(pin: String) } class GenericTextEnterPinPassword ( private val view: View, private val editText: ArrayList<EditText>, // 新增回调参数 private val onPinCompleteListener: OnPinCompleteListener ) : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { } override fun afterTextChanged(s: Editable?) { val string = s.toString() when (view.id) { R.id.otp_edit_box5 -> { if (string.length == 1) editText[1].requestFocus() } R.id.otp_edit_box6 -> { if (string.length == 1) editText[2].requestFocus() else if (string.isEmpty()) editText[0].requestFocus() } R.id.otp_edit_box7 -> { if (string.length == 1) editText[3].requestFocus() else if (string.isEmpty()) editText[1].requestFocus() } R.id.otp_edit_box8 -> { if (string.isEmpty()) { editText[2].requestFocus() } else if (string.length == 1) { // 拼接4位输入框的内容得到完整PIN val completePin = editText.joinToString("") { it.text.toString() } if (completePin.length == 4) { // 触发回调通知 onPinCompleteListener.onPinInputCompleted(completePin) } } } } } }
步骤2:在目标类接收回调
你可以直接复用现有SingleLiveData发送事件,首先先给CallToAction枚举/密封类新增PIN完成的类型(示例):
// 假设你的CallToAction是密封类,新增如下类型 sealed class CallToAction { // 原有其他事件保持不变 data class PinCompleted(val pin: String): CallToAction() }
然后在AppLockWidgetImpl中初始化GenericTextEnterPinPassword实例时,传入回调实现即可接收通知:
class AppLockWidgetImpl @Inject constructor( private val context: Context, override val onClicked: SingleLiveData<CallToAction> ) : AppLockWidget { // 示例初始化PIN输入监听的方法,可根据你实际的初始化逻辑调整 fun initPinEditText(editTexts: ArrayList<EditText>) { editTexts.forEachIndexed { index, editText -> editText.addTextChangedListener( GenericTextEnterPinPassword( view = editText, editText = editTexts, onPinCompleteListener = { pin -> // 收到PIN完成回调,通过LiveData发送事件 onClicked.postValue(CallToAction.PinCompleted(pin)) } ) ) } } // 其他原有逻辑保持不变 }
效果示意图

内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

