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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:15:06