我的 EditText 的 Textwatcher 多次触发 afterTextChanged

如何解决我的 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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res