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

起因

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

图1

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

解决办法

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

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

图2

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

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

图4

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

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

猜你喜欢

转载自blog.csdn.net/qugename/article/details/57128645