2017-09-01 11 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説明コードこのように使用できます。これがあなたのために働くことを願っています。

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; 
} 
関連する問題