2013-07-26 16 views
12

Ciao Ho impostato del testo in una vista testo.Come convertire SpannedString in Spannable

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

poi ho bisogno di convertire il testo del TextView in Spannble. Quindi ho fatto questo tipo:

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

ho bisogno di convertirlo Spannable perché ho passato la TextView in una funzione:

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

Questa mostra nessun errore/avvertimento. Ma gettando un errore di runtime:

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

Come posso convertire lo SpannedStringt/testo del TextView in Spannble? Oppure posso svolgere lo stesso compito con SpannedString all'interno della funzione?

+0

Terribile quando i ragazzi dell'UI decidono di creare collegamenti senza sottotitoli eh? Passando attraverso la stessa cosa – portfoliobuilder

risposta

20

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

new SpannableString(textView.getText()) dovrebbe funzionare.

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

dispiace, ma removeSpan() e setSpan() sono metodi sull'interfaccia Spannable, e SpannedString non implementa Spannable.

+0

'new SpannableString (textView.getText())' Non mi serve perché 'textView.getText()' è già 'SpannedString'. Devo convertire 'textView.getText()' in 'Spannable'. C'è un modo? –

+1

@typedef: Si prega di rileggere la mia risposta. Nota che ti sto costruendo un ** 'SpannableString' **. 'SpannableString' implementa' Spannable'. 'SpannedString' no. – CommonsWare

+0

Signore, allora come posso convertire la sottolineatura del testo di una vista testuale. Puoi darmi qualche suggerimento? –

-1

Se si specifica BufferType.SPANNABLE quando si imposta il testo 's il TextView, poi quando ottiene il testo si può lanciare a Spannable

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

Questo dovrebbe essere il lavoro corretto intorno. Il suo ritardo tho ma qualcuno potrebbe aver bisogno in futuro

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

Purtroppo nessuno di questi ha funzionato per me, ma dopo trafficando con tutte le vostre soluzioni ho trovato qualcosa che ha funzionato.

Sarà errore getto del textView.getText() per Spannable se non si specifica come SPANNABLE

noti anche da @ pagina CommonsWare:

Si noti che non si desidera chiamare setText() sul TextView, pensando che tu stia sostituendo il testo con la versione modificata. Stai modificando il testo di TextView sul posto in questo metodo fixTextView(), e quindi setText() non è necessario. Peggio ancora, se si utilizza Android: autoLink, setText() farebbe tornare indietro Android e aggiungere nuovamente 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); 
    } 
}