我在做一個程序,用戶可以使用正則表達式在文本中進行搜索,並且我想讓匹配的文本被選中。所以我使用這個代碼:使用EditText.setSelection()時發生意外的行爲
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;
}
}
它的工作原理。
從它的外觀來看,你提供的代碼片段應該工作得很好。你在使用EditTexts嗎? – zabawaba99
是的,我正在使用EditTexts。 – Qrox