2013-07-26 1 views
12

Здравствуйте, я установил некоторый текст в текстовом виде.Как преобразовать SpannedString в Spannable

TextView tweet = (TextView) vi.findViewById(R.id.text); 
tweet.setText(Html.fromHtml(sb.toString())); 

Тогда мне нужно преобразовать текст TextView в Spannble. Так что я сделал это, как:

Spannable s = (Spannable) tweet.getText(); 

Мне нужно преобразовать его Spannable, потому что я прошел TextView в функцию:

private void stripUnderlines(TextView textView) { 
      Spannable s = (Spannable) textView.getText(); 
      URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
      for (URLSpan span : spans) { 
       int start = s.getSpanStart(span); 
       int end = s.getSpanEnd(span); 
       s.removeSpan(span); 
       span = new URLSpanNoUnderline(span.getURL()); 
       s.setSpan(span, start, end, 0); 
      } 
      textView.setText(s); 
     } 

private class URLSpanNoUnderline extends URLSpan { 
     public URLSpanNoUnderline(String url) { 
      super(url); 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    } 

Это не показывает ошибки/предупреждения. Но бросать ошибки Runtime:

java.lang.ClassCastException: android.text.SpannedString cannot be cast to android.text.Spannable 

Как я могу преобразовать SpannedStringt/текст TextView в Spannble? Или я могу выполнить ту же задачу с SpannedString внутри функции?

+0

Ужасно, когда ребята из UI решают сделать ссылки без подчеркивания, да? Пройдя через то же самое. – portfoliobuilder

ответ

20

How can I convert the SpannedStringt/text of the textview into Spannble?

new SpannableString(textView.getText()) должно работать.

Or can I do the same task with SpannedString inside the function?

Извините, но removeSpan() и setSpan() методы на интерфейсе Spannable и SpannedString не реализует Spannable.

+0

'new SpannableString (textView.getText())' Мне это не нужно, потому что 'textView.getText()' уже 'SpannedString'. Мне нужно преобразовать 'textView.getText()' в 'Spannable'. Там в любом случае? –

+1

@typedef: Пожалуйста, перечитайте мой ответ. Обратите внимание, что я создаю ** 'SpannableString' **. 'SpannableString' реализует' Spannable'. 'SpannedString' не делает. – CommonsWare

+0

Сэр, тогда как я могу преобразовать подчеркивание текста текстового вида. Можете ли вы дать мне несколько советов? –

-1

Если указать BufferType.SPANNABLE при установке текста TextView «s, то при получении текст, который вы можете бросить его Spannable

myTextView.setText("hello", TextView.BufferType.SPANNABLE); 
... 
... 
... 
Spannable str = (Spannable) myTextView.getText(); 
2

Это должно быть правильной работы вокруг. Его поздно Тхо, но кто-то может понадобиться в будущем

private void stripUnderlines(TextView textView) { 
     SpannableString s = new SpannableString(textView.getText()); 
     URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
     for (URLSpan span : spans) { 
      int start = s.getSpanStart(span); 
      int end = s.getSpanEnd(span); 
      s.removeSpan(span); 
      span = new URLSpanNoUnderline(span.getURL()); 
      s.setSpan(span, start, end, 0); 
     } 
     textView.setText(s); 
    } 



private class URLSpanNoUnderline extends URLSpan { 
    public URLSpanNoUnderline(String url) { 
     super(url); 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     super.updateDrawState(ds); 
     ds.setUnderlineText(false); 
    } 
} 
0

К сожалению, ни один из них не работал для меня, но после того, как возиться со всеми вашими решениями я нашел то, что работал.

Это будет ошибка литья textView.getText() в Spannable, если не указано как SPANNABLE

Также Обратите внимание от @ страницы CommonsWare в:

Обратите внимание, что вы не хотите вызвать SetText() на TextView, думая, что вы замените текст модифицированной версией. Вы изменяете текст TextView в этом методе fixTextView(), поэтому setText() не требуется. Хуже того, если вы используете андроид: autoLink, setText() заставит Android вернуться и снова добавить URLSpans.

accountAddressTextView.setText(accountAddress, TextView.BufferType.SPANNABLE); 

stripUnderlines(accountAddressTextView); 

private void stripUnderlines(TextView textView) { 
    Spannable entrySpan = (Spannable)textView.getText(); 
    URLSpan[] spans = entrySpan.getSpans(0, entrySpan.length(), URLSpan.class); 

    for (URLSpan span: spans) { 
      int start = entrySpan.getSpanStart(span); 
      int end = entrySpan.getSpanEnd(span); 
      entrySpan.removeSpan(span); 
      span = new URLSpanNoUnderline(entrySpan.subSequence(start, end).toString()); 
      entrySpan.setSpan(span, start, end, 0); 
    } 
}