2012-09-25 40 views
1

我在做一個程序,用戶可以使用正則表達式在文本中進行搜索,並且我想讓匹配的文本被選中。所以我使用這個代碼:使用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; 
         } 
        } 

它的工作原理。

+0

從它的外觀來看,你提供的代碼片段應該工作得很好。你在使用EditTexts嗎? – zabawaba99

+0

是的,我正在使用EditTexts。 – Qrox

回答

1

我測試了你的代碼並加入了一個修改。

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

然後我確定我的EditText只有1,它突出了整個事情。

很多人需要確認您的正則表達式是否正確寫入。您可以在regualr表達here(我剛剛使用過的同一網站)上看到更多信息。

+0

我不是說它沒有 – Qrox

+0

對不起。我不是說它不是一直工作。當我將光標設置到文本中的任何位置,然後按下搜索按鈕時,它不起作用。當我編輯正則表達式後立即按下按鈕時,它工作得很好。 – Qrox

+0

您是否想檢查整個編輯文本,無論光標位置還是隻從光標所在的位置開始? – zabawaba99

相關問題