我一直在遇到EditText .setSelection的一些奇怪行为,希望大家都能帮忙!
我正在使用的应用程序具有搜索字段,因此需要使其行为与浏览器搜索栏非常相似。例如,如果用户键入“ fo”,我们希望EditText自动完成显示为“ foobar”,并突出显示自动完成的“ obar”文本,以便在自动完成不符合用户预期的情况下可以由用户轻松替换。输入。
要完成此操作,我有一个带有TextWatcher设置的EditText字段,以尝试自动完成afterTextChanged之后的文本。以下是我的代码:
editText.addTextChangedListener(new TextWatcher() {
int lastCount = 0;
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
editText.removeTextChangedListener(this);
String searchString = editable.toString();
if (editable.length() > lastCount) {
lastCount = editable.length();
int oldLength = searchString.length();
String autoFillResult = completeAutofill(searchString);
if (!autoFillResult.equals("")) {
searchString = autoFillResult;
editable.clear();
editable.append(autoFillResult);
editText.setSelection(oldLength, autoFillResult.length());
}
} else lastCount = editable.length();
editText.addTextChangedListener(this);
}
});
我的问题如下。使用前面的“ Foobar”案例:
用户键入“ F”,EditText自动填充“ oobar”并将其突出显示。
然后用户键入第一个“ o”
EditText字段会立即清除(即afterTextChanged接收到带有空字符串的Editable)
EditText正确地自动填充到用户提供的“ Fo”,然后自动填充到突出显示的“ obar”。
问题是当用户键入下一个字符时,将清除EditText,然后将其重新填充,这会在EditText字段中造成明显的干扰。有趣的是,我单挑了editText.setSelection(oldLength,autoFillResult.length());。作为罪魁祸首(即注释掉该行摆脱了这个问题,但显然是错误的功能)。
在完成了一些Google研究和我自己的调试后,我仍然不确定为什么会这样。该问题似乎不太常见,因为我无法在Google上找到它,也无法通过自己的实验弄清楚该问题的原因。
提前谢谢!
答案 0 :(得分:0)
尝试删除editable.clear();
答案 1 :(得分:0)
if
条件应该为:
autoFillResult != null && !autoFillResult.equals("")
您可能正在寻找(或尝试重新创建)AutoCompleteTextView时。