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

寻找TextWatcher替代方案:实现EditText动态文本格式并兼容扫描器

解决方案:EditText最后三位加粗且兼容扫描器ENTER键功能

核心思路

避开直接使用TextWatcher(会干扰扫描器按键事件传递),改用SpannableString动态处理文本样式,同时通过重写EditText内部的文本变更方法监听输入,不阻断扫描器原生按键逻辑。

具体实现步骤

1. 自定义EditText,重写onTextChanged方法

EditText本身提供onTextChanged生命周期方法,直接重写它可以替代TextWatcher的功能,且不会干扰扫描器的按键事件传递:

class BoldLastThreeEditText @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.editTextStyle
) : AppCompatEditText(context, attrs, defStyleAttr) {

    override fun onTextChanged(text: CharSequence?, start: Int, lengthBefore: Int, lengthAfter: Int) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter)
        applyBoldLastThreeStyle(text)
    }

    private fun applyBoldLastThreeStyle(text: CharSequence?) {
        text ?: return
        val spannable = SpannableString(text)
        val textLength = text.length
        if (textLength >= 3) {
            spannable.setSpan(
                StyleSpan(Typeface.BOLD),
                textLength - 3,
                textLength,
                Spannable.SPAN_INCLUSIVE_INCLUSIVE
            )
        }
        // 直接设置Spannable,无额外回调避免循环
        setText(spannable)
        // 保持光标在文本末尾
        setSelection(textLength)
    }

    // 适配数据库读取场景:手动触发样式设置
    fun setTextWithBoldStyle(content: String) {
        applyBoldLastThreeStyle(content)
    }
}

2. 正常监听扫描器ENTER键

在Activity/Fragment中给自定义EditText绑定OnKeyListener,此时无TextWatcher干扰,扫描器的ENTER键事件可正常触发:

binding.boldLastThreeEditText.setOnKeyListener { v, keyCode, event ->
    if (event.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
        // 执行扫描后的核心业务逻辑,比如提交数据
        handleScanResult(binding.boldLastThreeEditText.text.toString())
        true
    } else {
        false
    }
}

3. 适配三种业务场景

  • 扫描条形码:扫描器输入文本后,自定义EditText的onTextChanged自动触发样式设置,同时ENTER键事件正常被监听。
  • 键盘输入:用户手动输入时,onTextChanged实时更新最后三位加粗样式,光标始终保持在末尾。
  • 数据库读取:调用setTextWithBoldStyle方法传入数据库内容,直接应用加粗样式。

关键优势

  • 规避了TextWatcher与扫描器按键事件的冲突,重写的onTextChanged属于EditText内部生命周期,不阻断原生按键传递。
  • 使用SpannableString替代HTML格式,样式处理更高效,且不会触发额外文本变更回调。
  • 自动维护光标位置,不影响用户输入体验。

内容的提问来源于stack exchange,提问作者lezn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:20:02