检测EditText的内容是由用户还是以编程方式更改的?

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)


Pet*_*rus 9

接受的答案是完全有效的,但我有另一种方法;

@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)

它通过检查更改是否是单个字符来工作.这不是一个万无一失的解决方案,因为可能会错过复制粘贴操作,并且也会错过单个字符的非用户更改.根据您的使用情况,这可能是一个可行的解决方案.

  • 错误的答案。如果使用任何剪切/粘贴或突出显示编辑,将产生错误的结果。完全错了。 (2认同)

Vas*_*kov 7

根据您的用例(例如,当用户在另一个字段中键入内容时自动填充此字段),您还可以检查视图是否具有焦点,例如:

textView.doAfterTextChanged {
    val isValueChangedByUser = textView.hasFocus()
    // ...
}
Run Code Online (Sandbox Code Playgroud)