2013-11-21 2 views
0

Я ищу способ найти различные строки в TextView и заменить их стилизованными SpannableStrings.Как заменить несколько строк на TexView для SpannableStrings?

Я нашел этот код в How to use SpannableString with Regex in android?, что делает только что для одной строки:

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); 
    } 

} 

Это прекрасно работает, но я не уверен, как адаптировать его использовать, если с несколькими строками. Я попытался повторно реализовать его с помощью SpannableStringBuilder.replace, поэтому я могу запускать этот метод несколько раз, сохраняя прежний стиль, но не выполнив его.

Любые идеи?

Спасибо!

ответ

0

Это прекрасно работает, но я не уверен, как его адаптировать, если использовать несколько строк.

экспромтом ...

Шаг 1: Изменение changeTextinView() взять SpannableString в качестве первого параметра, вместо TextView.

Шаг # 2: Изменить onCreate() создать SpannableString из dispStr и передать в changeTextinView(), а затем взять SpannableString и передать его в setText() на TextView.

На данный момент, она должна работать, как это было раньше, за исключением того, что вы будете в состоянии сделать:

Шаг # 3: Call changeTextinView() несколько раз подряд, один раз в строке.

Вещи будут несколько грязными, если есть перекрытие (например, вы хотите отформатировать ABCDEF в одну сторону и CDE другим способом), но я надеюсь, что это не так для вас.

+0

Отлично, очень просто. Благодаря! – Cruclax