我的 EditText 的 Textwatcher 多次触发 afterTextChanged

问题描述

我正在使用 datetime_cols= pd.to_datetime(df.columns,dayfirst=True,errors='coerce') out = (df.loc[:,(datetime_cols.year == year) & (datetime_cols.month == month)] .reset_index()) 来预设文本或让用户输入内容。我想让它“全部大写”,所以我为我的 EditText 实现了大写功能

您可以使用此 TextWatcher 进入和离开屏幕,并且 EditText 多次来回切换屏幕 - 这意味着我必须从 {{1} 正确注册和注销 TextWatcher } 在屏幕进入/离开事件时。

我注意到,如果我连续多次进入和离开屏幕,在第 5 次进入时,我的整个应用程序都被冻结了 - 所以有些东西阻塞了 UI 线程。

经过深入调查,我发现如果我调用 TextWatcher,它会多次触发我的 EditText 侦听器。在第 5 次进入时,它像 连续 50 次 那样触发它并导致 UI 线程阻塞。

这是如何修复的,还是 Android 方面的错误

代码: 进入时初始化屏幕:

editText.setText("some string")

All-Cap 转换功能(不应触发 TextWatcher)

afterTextChanged

离开前清屏:

initEditTextListener()
App.log("FormScreen - setData")
formFirstEt?.setText(item.name)

private var inputWatcher: TextWatcher? = null
private fun initEditTextListener(){
        formFirstEt?.onEditorAction{
            formInputValidation(this.text.toString(),formFirstEt,App.getString("form_empty"),App.getString("form_empty_reason"))
            validateData()
            formSecondEt?.let { s -> if (s.isEnabled) s.requestFocus() }
        }

        inputWatcher = object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
                App.log("FormScreen - initEditTextListener - afterTextChanged")
                validateData()
            }
            override fun beforeTextChanged(s: CharSequence?,start: Int,count: Int,after: Int) {}
            override fun onTextChanged(s: CharSequence?,before: Int,count: Int) {
                App.log("FormScreen - initEditTextListener - onTextChanged")
                validateData()
                formFirstEt?.let { et -> onFormFirstInputChanged(s.toString(),this,et)}
            }
        }

        inputWatcher?.let {formFirstEt?.addTextChangedListener(it)}
    }

日志:

fun onFormFirstInputChanged(s: String,tv: TextWatcher,et: EditText) {
    et.removeTextChangedListener(tv)
    if (isFirstInputValid(s)) {
        with(et) {
            text.clear()
            append(s.toupperCase(Locale.getDefault()))
            setSelection(s.length)
        }
    } else {
        val substring = s.substring(0,s.length - 1)
        with(et) {
            text.clear()
            append(substring.toupperCase(Locale.getDefault()))
            setSelection(substring.length)
        }
    }
    et.addTextChangedListener(tv)
}

更新: 这是 Kotlin 的一些行为。问题出在 formFirstEt?.setText("") inputWatcher?.let { formFirstEt?.removeTextChangedListener(it) } inputWatcher = null 上,我预计它会向 -- First time screen enter --- 2021-01-14 11:24:50.324 1136-1136/? I/Project: FormScreen - setData 2021-01-14 11:24:50.458 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged 2021-01-14 11:24:50.460 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged 2021-01-14 11:24:52.838 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged 2021-01-14 11:24:52.841 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged -- Second time screen enter -- 2021-01-14 11:24:56.324 1136-1136/? I/Project: FormScreen - setData 2021-01-14 11:24:56.366 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged 2021-01-14 11:24:56.367 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged 2021-01-14 11:24:56.368 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged 2021-01-14 11:24:56.368 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged 2021-01-14 11:24:56.369 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged 2021-01-14 11:24:56.369 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged 2021-01-14 11:24:56.370 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged 2021-01-14 11:24:56.370 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged 2021-01-14 11:24:56.371 1136-1136/? I/Project: FormScreen - initEditTextListener - onTextChanged 2021-01-14 11:24:56.372 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged 2021-01-14 11:24:56.372 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged 2021-01-14 11:24:56.373 1136-1136/? I/Project: FormScreen - initEditTextListener - afterTextChanged 添加空字符串,但显然它正在添加字符终止符。 Kotlin 无法识别它的 formFirstEt?.setText("") 但它的 EditText 认以 String 字符结尾。这个字符数组在本机 char array 函数中触发了一些奇怪的行为,这是垃圾邮件 \0

修复:

setText

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)