Mag*_*s W 49 android listview textwatcher android-edittext
我需要一种方法来检测EditText是否已被用户输入内容更改或由应用程序以编程方式更改文本.这样做的任何标准方式?我想我总是可以做一些像以前那样取消TextWatcher setText()并且之后又重新设置它的东西,但是必须有更好的方法来做到这一点......对吗?
我试着检查EditText是否在TextWatcher中聚焦,但是由于EditTexts在滚动时无论如何都"半随机"聚焦,因此没什么帮助...
背景
我在每个listitem都有一个带有EditTexts的ListView.我已经整理出了存储EditTexts值的基本问题,以便在用户滚动时重用.
我还有一个TextWatcher,它汇总了所有EditTexts中的值,并在用户编辑任何EditTexts的内容时显示总和.
问题是,当我滚动列表并且我的自定义适配器重新输入EditTexts中的存储值时bindView(),这也会触发TextWatchers afterTextChanged()方法,导致滚动滞后,因为触发了求和功能.
Mag*_*s W 49
这很久以前就已经解决了,但对于那些在这里寻找答案的人来说,这就是我所做的:
在我即将以编程方式更改它,并更改值,然后将Tag重置为null之前,我最终将EditText的Tag设置为某个任意值.然后在我的TextWatcher.afterTextChanged()方法中,我检查Tag是否为null,以确定它是用户还是更改了值的程序.奇迹般有效!
像这样的东西:
edit.setTag( "arbitrary value" );
edit.setText( "My Text Value" );
edit.setTag(null);
Run Code Online (Sandbox Code Playgroud)
然后
public void afterTextChanged(Editable s) {
if( view.getTag() == null )
// Value changed by user
else
// Value changed by program
}
Run Code Online (Sandbox Code Playgroud)
接受的答案是完全有效的,但我有另一种方法;
@Override
public void onTextChanged(CharSequence charSequence,
int start, int before, int count) {
boolean userChange = Math.abs(count - before) == 1;
if (userChange) {
}
}
Run Code Online (Sandbox Code Playgroud)
它通过检查更改是否是单个字符来工作.这不是一个万无一失的解决方案,因为可能会错过复制粘贴操作,并且也会错过单个字符的非用户更改.根据您的使用情况,这可能是一个可行的解决方案.
根据您的用例(例如,当用户在另一个字段中键入内容时自动填充此字段),您还可以检查视图是否具有焦点,例如:
textView.doAfterTextChanged {
val isValueChangedByUser = textView.hasFocus()
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12514 次 |
| 最近记录: |