gpt4 book ai didi

android - 使用 EditText.setSelection() 时的意外行为

转载 作者:行者123 更新时间:2023-11-30 04:00:23 30 4
gpt4 key购买 nike

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

    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;
}
}

而且有效。

最佳答案

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

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

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

您可能需要确认您的正则表达式是否正确编写。你可以看到更多关于正则表达式的信息 here (我刚刚使用的同一网站)。

关于android - 使用 EditText.setSelection() 时的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12583668/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com