2013-11-21 49 views
0

我正在尋找一種方法來查找TextView上的不同字符串,並將其替換爲樣式化的SpannableStrings。如何替換TexView的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()採取SpannableString作爲第一個參數,而不是TextView

步驟#2:修改onCreate()創建從一個dispStrSpannableString傳遞到changeTextinView(),然後採取SpannableString並將它傳遞給setText()TextView

在這一點上,它應該工作像以前一樣,不同之處在於你會在位置做:

第3步:連續通話changeTextinView()幾次,每串一次。

事情會變得有些混亂,如果有重疊(例如,要格式化ABCDEF單向和CDE另一種方式),但我希望是不適合你的情況。

+0

非常好,很簡單。謝謝! – Cruclax