Asa*_*afK 40 android android-layout textwatcher
我对TextWatcher有一个恼人的问题.我一直在网上搜索,但找不到任何东西.感谢有人能帮助我.
出于某种原因,在一次文本更改时对TextWatcher事件的调用是不稳定的.有时它们会被触发一次(就像它们应该的那样),有时是两次,有时是3次.不知道为什么,整件事情非常直截了当.有时候,afterTextChanged()上的Editable参数会返回toString()和length()中的空值.
代码如下:
private TextWatcher mSearchAddressTextChangeListener = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable searchedAddress) {
System.out.println("called multiple times.");
}
};
Run Code Online (Sandbox Code Playgroud)
内部afterTextChanged()(和AsyncTask)我没有对文本或EditText视图进行任何更改.
我看到在TextWatcher的事件中询问的问题被调用了两次,但我发现事件触发的次数多于(或少于)两次.
无论如何,感谢任何帮助.
编辑:我删除了afterTextChanged()的内容导致即使没有我的代码也会发生此问题.是什么让我相信这是一个错误.当在常规字符(事件处理程序被触发两次)之后输入'space'字符时或者在删除常规字符之后的'space'字符(退格.事件处理程序被触发3次)时,会发生错误.帮助仍将受到赞赏.
Nic*_*ico 54
我有同样的问题,当我在连续文本的末尾用光标按下退格键时,afterTextChange被调用3次: - 第一次使用正确的s值 - 第二次使用清除值 - 第三次使用再次正确的值
在网上搜索了很多之后,我尝试将EditText inputType更改为
android:inputType="textNoSuggestions"
Run Code Online (Sandbox Code Playgroud)
不要问我为什么,但它有效,afterTextChanged现在只调用一次.
根据TextWatcher的开发人员页面,如果对Editable内部进行了更改TextWatcher,则会触发对所有TextWatchers链接的进一步调用Editable.现在,显然您的代码不会触发此行为.
然而,这是很有可能的是,如果出于某种原因,该系统具有一TextWatcher对Editable,可能会出现您所描述的情况."为什么",我听到你哭,"这应该发生吗?"
首先,经典防御:没有理由不发生,严格来说,应该编写应用程序代码以适应它.
其次,我无法证明这一点,但我可以想象处理显示文本布局的代码EditText使用a TextWatcher来处理更新屏幕上文本的显示.此代码可能会将控制代码(未显示)插入到该代码中Editable以确保良好的换行符等.它甚至可以循环几次以使其正确,并且您可能只有在完成所有操作后才能进行第一次调用...
编辑
根据@Learn OpenGL ES的评论,调用TextWatcher对于自动更正这样的事情是正常的.
你可以使用布尔检查,例如:
inputBoxNumberEt.addTextChangedListener(new TextWatcher() {
boolean ignoreChange = false;
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (!ignoreChange) {
///Do your checks
ignoreChange = true;
inputBoxNumberEt.setText(string);
inputBoxNumberEt.setSelection(inputBoxNumberEt.getText().length());
ignoreChange = false;
}
}
});
Run Code Online (Sandbox Code Playgroud)
小智 5
boolean isOnTextChanged = false;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
isOnTextChanged = true;
}
@Override
public void afterTextChanged(Editable quantity) {
if (isOnTextChanged) {
isOnTextChanged = false;
//dosomething
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18653 次 |
| 最近记录: |