文档章节

Android 避免2个相互关联的 EditText 死循环

布拉德利_蔡
 布拉德利_蔡
发布于 2017/02/06 20:10
字数 453
阅读 27
收藏 0

##起因 最近在做一个汇率转换的App练手,界面上会有两个相关联的的EditText,改变其中一个的值,另一个也会随之改变。

界面

对于这个问题最简单的思路就是为每个EditText附上addTextChangedListener,并实现TextWatcher,在afterTextChanged中去修改另一个EditText的值,但这种实现方式会造成死循环。仔细想想,更改EditText A的时候会触发TextChangedListener,然后修改了EditText B的值,这个时候EditText B的TextChangedListener被触发,又去修改EditText A的值,如此循环,不穷尽也。

##解决办法

网上已经有一些解决办法了,大致的思路就是当焦点在一个EditText上时,注销另一个EditText的监听,这个思路是正确的,但不太适合我这个App,上述的思路有一个前提就是,每次只会有一个EditText的值被修改。但我这个App存在一种情况,就是去选择货币类型重新返回到这个页面的时候会整体刷新一下界面,同时调用这两个EditText的setText,这样又会陷入死循环。 后来我发现只要调用了setText就会触发TextChangedListener,哪怕前后的值是一模一样的。

我就去看了一下源码,最终会调用到这个setText:

setText

往下翻,在函数的末尾有这么一段: setText

发现这有个needEditableForNotification,再往前翻:

setText

这个needEditableForNotification的值就是判断当前有没有注册监听,如果有就在setText函数的最后通知各个监听。

那么解决方法就很简单了,就只要在调用setText之前把监听注销掉,setText之后再注册回来就行了,注销监听就用removeTextChangedListener。

© 著作权归作者所有

共有 人打赏支持
布拉德利_蔡

布拉德利_蔡

粉丝 0
博文 5
码字总数 2293
作品 0
南京
程序员
Activity 与 Fragment 之间相互通信

欢迎转载,但请保留文章原始出处→→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4000390.html 联系方式:smyhvae@163.com 【正文】 一、接口回...

iSnowFlake
2015/11/19
0
1
android Configuration系统设置

Configuration类是专门用来描述手机设备上的配置信息。这些配置信息包括用户特定的配置项,也包括系统的动态设备配置。 程序中可调用Activity的如下方法来获取Configuration对象 //获取系统的...

张林思密达
2015/08/19
0
0
Android:Layout_weight的深刻理解,个人首发,欢迎转载和顶贴!

分类: Android2012-06-06 00:58 439人阅读 评论(10) 收藏 举报 最近写Demo,突然发现了Layout_weight这个属性,发现网上有很多关于这个属性的有意思的讨论,可是找了好多资料都没有找到一个...

thisiscx
2012/12/27
0
3
Android开发之EditText属性详解

1、EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformation...

的书法上的
2014/07/28
0
0
Android Activity生命周期

Android中Activity的生命周期,我今天特意在重新总结一下. Activity有四种本质区别的状态: (1)在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running) (2)如果一个A...

gavin_jin
2012/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java GC机制详解

垃圾收集 Garbage Collection 通常被称为“GC”,本文详细讲述Java垃圾回收机制。 导读: 1、什么是GC 2、GC常用算法 3、垃圾收集器 4、finalize()方法详解 5、总结--根据GC原理来优化代码 ...

小刀爱编程
27分钟前
1
0
ORACEL学习--理解over()函数

二、理解over()函数 1.1、两个order by的执行时机 分析函数是在整个sql查询结束后(sql语句中的order by的执行比较特殊)再进行的操作, 也就是说sql语句中的order by也会影响分析函数的执行结果...

spinachgit
29分钟前
1
0
抽象语法树

import asttree = ast.parse('def hello_word(): print("hello world!")')def hell_word(): print(1)print(ast.dump(tree)) 语法树 可以基于这个实现另外一种编程语言...

colin_86
30分钟前
2
0
Akka查询设备组《fourteen》译

加入以下依赖到项目中: 介绍: 到目前为止,我们看到的会话模式很简单,因为它们要求Actor保持很少或没有状态。 特别: 设备actor返回一个读数,不需要更改状态。 记录温度,更新单个字段。...

woshixin
37分钟前
1
0
wait、notify、notifyAll 的用法

wait()、notify()、notifyAll()是三个定义在Object类里的方法,用来控制线程的状态。这三个方法最终调用的都是jvm的native方法, 随着jvm运行平台的不同可能有些许差异。 wait(): 使持有该对...

noob_fly
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部