使用EditText.setSelection()时出现意外的行为

时间:2012-09-25 13:09:08

标签: android

我正在做一个程序,用户可以使用正则表达式搜索文本,我想让匹配的文本被选中。所以我使用这段代码:

    public void onClick(View v) {
        try {
            switch (v.getId()) {
                case R.id.btn_search:
                    Matcher m = Pattern.compile(reg.getText().toString()).matcher(txt.getText());
                    int start = txt.getSelectionStart();
                    if (start != txt.getSelectionEnd()) {
                        start++;
                    }
                    if (start < 0 || start >= txt.length()) {
                        start = 0;
                    }
                    while (true) {
                        try {
                            m.find(start);
                            txt.setSelection(m.start(), m.end());
                            txt.requestFocus();
                            break;
                        } catch (IllegalStateException ex) {
                            if (start == 0) {
                                err_notfound.show();
                                break;
                            }
                            start = 0;
                        }
                    }
                    break;
            }
        } catch (PatternSyntaxException ex) {
            err_syntax.show();
        } catch (Throwable ex) {
            showException("onClick", ex);
        }
    }

但是代码没有按预期运行。当我手动将光标移动到某个位置,然后按下搜索按钮时,程序有时会将光标设置为m.start(),但不会将选择范围扩展为m.end()。我测试了程序,m.start()和m.end()具有不同的值。 如果有人知道导致问题的原因,请告诉我。我会很感激的。

编辑:谢谢你的帮助!我找到了问题的答案。它与用于移动光标和选择文本的引脚有关(我不知道它叫什么......)。如果它显示在文本字段中,并且调用了setSelection(),则EditText将不会正确显示选择。但是,如果您使用getSelectionStart()和getSelectionEnd(),则会发现它们与m.getStart()和m.getEnd()的值完全相同。这可能是一个错误。所以我的解决方案是首先调用clearFocus()。修改后的代码是这样的:

                    txt.clearFocus();
                    while (true) {
                        try {
                            m.find(start);
                            txt.setSelection(m.start(), m.end());
                            txt.requestFocus();
                            break;
                        } catch (IllegalStateException ex) {
                            if (start == 0) {
                                err_notfound.show();
                                break;
                            }
                            start = 0;
                        }
                    }

它有效。

1 个答案:

答案 0 :(得分:1)

我测试了你的代码并进行了一次修改。

 Matcher m = Pattern.compile("1*", Pattern.CASE_INSENSITIVE).matcher(txt.getText()); 

然后我确保我的EditText只有1个,它突出显示了整个事情。

您需要确认正则表达式是否正确写入。您可以在regualr表达式here(我刚刚使用的同一站点)上看到更多信息。

相关问题