Android 避免2个相互关联的 EditText 死循环
Android 避免2个相互关联的 EditText 死循环
布拉德利_蔡 发表于1年前
Android 避免2个相互关联的 EditText 死循环
  • 发表于 1年前
  • 阅读 18
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

##起因 最近在做一个汇率转换的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
博文 3
码字总数 2293
×
布拉德利_蔡
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: