2017-09-01 41 views
2

我想從字符串中替換多個匹配。多重匹配並在SpanableString中替換android

這是我的代碼。

SpannableStringBuilder ss = new SpannableStringBuilder(str); 
Pattern userNamePattern = Pattern.compile("\\[(.*?)\\]"); 
Matcher userNameMatcher = userNamePattern.matcher(ss); 
while (userNameMatcher.find()) { 
    final int start = userNameMatcher.start(); 
    final int end = userNameMatcher.end(); 
    ss.setSpan(new ClickableSpan() { 
     final String clickString = str.substring(start,end); 
     @Override 
     public void onClick(View widget) { } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    ss.replace(start, end, str.substring(start+1,end-1)); 
} 

它取代文字,但不給最好的結果。
例如,如果測試是[A] b [cd] e那麼結果是A b [ccd 我需要的結果是A b cd e
我該如何做到這一點我在這裏做錯了。

+0

由於您正在嘗試在此處進行標記,因此您當前的輸入和預期輸出並不能說明整個故事。在這種情況下,您可能實際上需要包含幾個小屏幕捕獲來說明發生了什麼。 –

+0

什麼屏幕捕捉它的完整問題。預期的輸出不返回。 – PakDeveloper

+0

請參閱https://pastebin.com/raw/w2Fx2cdq – pskink

回答

1

作爲@pskink解釋代碼Here您可以使用它這樣的東西。我希望這個爲你工作。

SpannableStringBuilder ss = new SpannableStringBuilder(str); 
Pattern userNamePattern = Pattern.compile("\\[(.*?)\\]"); 
Matcher userNameMatcher = userNamePattern.matcher(ss); 
int delta = 0; 
while (userNameMatcher.find()) { 
    final int start = userNameMatcher.start() - delta; 
    final int end = userNameMatcher.end() - delta; 
    ss.setSpan(new ClickableSpan() { 
     final String clickString = str.substring(start,end); 
     @Override 
     public void onClick(View widget) { } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    ss.delete(end - 1, end); 
    ss.delete(start, start + 1); 
    delta += 2; 
}