2013-11-21 2 views
0

TextView에서 다른 문자열을 찾고 스타일이 적용된 SpannableString으로 바꾸는 방법을 찾고 있습니다.Texable에서 SpannableStrings에 여러 문자열을 대체하는 방법은 무엇입니까?

public class SpanTest extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     String dispStr = "This has the string ABCDEF in it \nSo does this :ABCDEF - see!\nAnd again ABCD here"; 
     TextView tv = (TextView) findViewById(R.id.textView1); 
     tv.setText(dispStr); 
     changeTextinView(tv, "ABC", Color.RED); 
    } 

    private void changeTextinView(TextView tv, String target, int colour) { 
     String vString = (String) tv.getText(); 
     int startSpan = 0, endSpan = 0; 
     Spannable spanRange = new SpannableString(vString); 

     while (true) { 
      startSpan = vString.indexOf(target, endSpan); 
      ForegroundColorSpan foreColour = new ForegroundColorSpan(colour); 
      // Need a NEW span object every loop, else it just moves the span 
      if (startSpan < 0) 
       break; 
      endSpan = startSpan + target.length(); 
      spanRange.setSpan(foreColour, startSpan, endSpan, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
     tv.setText(spanRange); 
    } 

} 

이 잘 작동하지만이 경우 여러 문자열을 사용하는 적응하는 방법을 잘 모르겠어요 :

나는 하나의 문자열을 그냥 않는 How to use SpannableString with Regex in android?에이 코드를 발견했다. SpannableStringBuilder.replace를 사용하여 다시 구현하려고 했으므로 이전 스타일을 유지하면서 여러 번 메서드를 실행할 수는 있지만 실패했습니다.

어떤 아이디어?

감사합니다.

답변

0

위대한 작품이지만, 여러 문자열을 사용하는 경우 그것을 사용하는 방법을 잘 모르겠습니다. 커프 오프

...

1 단계 : 변경 changeTextinView() 대신 TextView의 첫 번째 매개 변수로 SpannableString을 촬영합니다.

단계 # 2 : dispStr에서 SpannableString을 만들고 changeTextinView()에 그것을 통과, 다음 SpannableString을하고 TextViewsetText()에 전달하는 onCreate()을 수정합니다.

3 단계 :이 시점에서

은 이전에 그랬던 것처럼 당신이 할 수있는 위치에있을 것입니다 것을 제외하고는, 작동해야 한 번 문자열 당, 연속 changeTextinView() 여러 번 호출합니다.

겹치는 부분이 있다면 (예 : ABCDEF 편도, CDE 다른 방식으로 지정하려는 경우) 다소 혼란스러워 할 수 있습니다.하지만 나는 그렇지 않을 것으로 기대합니다.

+0

우수하고 간단합니다. 감사! – Cruclax

관련 문제