EditText setSelection清除文本然后重新输入

时间:2018-09-24 17:34:46

标签: android android-edittext

我一直在遇到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”案例:

  1. 用户键入“ F”,EditText自动填充“ oobar”并将其突出显示。

  2. 然后用户键入第一个“ o”

  3. EditText字段会立即清除(即afterTextChanged接收到带有空字符串的Editable)

  4. EditText正确地自动填充到用户提供的“ Fo”,然后自动填充到突出显示的“ obar”。

问题是当用户键入下一个字符时,将清除EditText,然后将其重新填充,这会在EditText字段中造成明显的干扰。有趣的是,我单挑了editText.setSelection(oldLength,autoFillResult.length());。作为罪魁祸首(即注释掉该行摆脱了这个问题,但显然是错误的功能)。

在完成了一些Google研究和我自己的调试后,我仍然不确定为什么会这样。该问题似乎不太常见,因为我无法在Google上找到它,也无法通过自己的实验弄清楚该问题的原因。

提前谢谢!

2 个答案:

答案 0 :(得分:0)

尝试删除editable.clear();

答案 1 :(得分:0)

if条件应该为:

autoFillResult != null && !autoFillResult.equals("")

您可能正在寻找(或尝试重新创建)AutoCompleteTextView时。