我怎样才能避免这样的代码行:
((EditText) findViewById(R.id.MyEditText)).setText("Hello");
将在此处引发事件:
((EditText) findViewById(R.id.MyEditText)).addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
// HERE
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
我想知道是否有任何方法可以禁止执行onTextChanged,正如我在选择AutoCompleteTextView的下拉结果时所注意到的那样(没有执行onTextChanged!)。
我不是在寻求“如果你什么都不做”之类的解决办法...
6条答案
按热度按时间pw136qt21#
AutoCompleteTextView的源代码显示,他们设置了一个布尔值,表示文本将被块完成替换
这是实现您想要的操作的最好方法。然后TextWatcher检查setText是否通过完成操作到达并从方法中返回
添加和移除TextWatcher将耗费应用程序更多的时间
qij5mzcb2#
您可以检查哪个视图当前具有焦点,以区分用户和程序触发的事件。
请看here,以获得更详细的答案。
qvsjd97n3#
或者,您可以简单地使用
mEditText.hasFocus()
来区分文本是人为更改的还是程序更改的,这对我来说很好:希望这有帮助!
xriantvc4#
另一种实现方法是使用
setOnKeyListener
。这将仅在用户按下某个键时触发,而不是在用户或以编程方式更改EditText时触发。
3bygqnnd5#
我不认为有一个简单的方法来禁用侦听器,但您可以通过以下任一方法来绕过它:
TextWatcher
,然后将其添加回去。boolean
标志,它告诉TextWatcher
忽略它。例如
在您的
TextWatcher
中:这是一个有点hacky,但它应该工作:)
llycmphe6#
我只能从两个方面看
由于第一种方法对您来说是一种不需要的变通方法,恐怕您必须使用第二种方法。