2013-07-26 18 views
12

Witam Mam ustawić tekst w textview.Jak przekonwertować SpannedString do Spannable

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

Potem trzeba konwertować tekst TextView do Spannble. Więc zrobiłem to tak:

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

muszę przekształcić go Spannable ponieważ zdałem TextView do funkcji:

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

To pokazuje żadnego błędu/ostrzeżenia. Ale rzucanie Runtime Error:

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

Jak przekonwertować SpannedStringt/tekst TextView w Spannble? Czy mogę wykonać to samo zadanie z funkcją SpannedString wewnątrz funkcji?

+0

Okropny, gdy użytkownicy interfejsu użytkownika decydują się na tworzenie linków bez podkreśleń, huh? Przechodząc przez to samo. – portfoliobuilder

Odpowiedz

20

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

new SpannableString(textView.getText()) powinien działać.

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

Niestety, ale removeSpan() i setSpan() są sposoby na interfejsie Spannable i SpannedString nie implementuje Spannable.

+0

'new SpannableString (textView.getText())' Nie potrzebuję tego, ponieważ 'textView.getText()' jest już 'SpannedString'. Muszę przekonwertować 'textView.getText()' na 'Spannable'. Czy jest jakiś sposób? –

+1

@ typedef: Proszę ponownie przeczytać moją odpowiedź. Zauważ, że tworzę konstrukcję ** 'SpannableString' **. 'SpannableString' implementuje' Spannable'. 'SpannedString' nie działa. – CommonsWare

+0

Proszę pana, jak mogę przekonwertować podkreślenie tekstu tekstu? Czy możesz dać mi wskazówki? –

-1

Jeśli podasz BufferType.SPANNABLE podczas ustawiania tekst TextView „s, a następnie, gdy coraz tekst można oddać go do Spannable

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

ten powinien być właściwą pracę wokół. Jego późno tho ale ktoś może potrzebować w przyszłości

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

Niestety żaden z nich nie pracował dla mnie, ale po fiddling ze wszystkich rozwiązań znalazłem coś, co działało.

Będzie błędów odlewania textView.getText(), aby Spannable chyba można określić go jako SPANNABLE

również zauważyć, ze @ stronie CommonsWare za:

pamiętać, że nie chce, aby zadzwonić setText() na TextView, myśląc, że zastąpisz tekst zmodyfikowaną wersją. Modyfikujesz tekst TextView na miejscu w tej metodzie fixTextView(), dlatego setText() nie jest potrzebny. Co gorsza, jeśli używasz Androida: autoLink, setText() spowoduje, że Android ponownie przejdzie i doda URLSpans ponownie.

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