2013-07-26 5 views
12

Hallo Ich habe Text in einer Textansicht festgelegt.So konvertieren Sie SpannedString zu spannbar

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

Dann brauche ich den Text des TextView in Spannble zu konvertieren. Also tat ich dies wie:

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

Ich brauche es Spannable zu konvertieren, weil ich die TextView in eine Funktion übergeben:

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

Dies zeigt keine Fehler/Warnung. Aber werfen einen Laufzeitfehler:

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

Wie kann ich die SpannedStringt/Text des Textview in Spannble konvertieren? Oder kann ich die gleiche Aufgabe mit SpannedString innerhalb der Funktion tun?

+0

Schrecklich, wenn UI Jungs entscheiden, Links ohne Unterstreichungen zu machen, huh? Durch dieselbe Sache gehen. – portfoliobuilder

Antwort

20

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

new SpannableString(textView.getText()) sollte funktionieren.

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

Sorry, aber removeSpan() und setSpan() sind Methoden auf der Spannable Schnittstelle und SpannedString nicht Spannable implementieren.

+0

'neuer SpannableString (textView.getText())' Ich brauche das nicht, weil 'textView.getText()' bereits 'SpannedString' ist. Ich muss 'textView.getText()' in 'spannable' konvertieren. Gibt es irgendeinen Weg? –

+1

@typedef: Bitte lesen Sie meine Antwort noch einmal. Bitte beachten Sie, dass ich Ihnen einen ** SpannableString ** konstruieren lasse. 'SpannableString' implementiert' spannable'. 'SpannedString' nicht. – CommonsWare

+0

Sir, wie kann ich dann die Unterstreichung des Textes einer Textansicht konvertieren? Kannst du mir ein paar Hinweise geben? –

-1

Wenn Sie BufferType.SPANNABLE angeben, wenn die TextView ‚s Texteinstellung, dann, wenn der Text immer Sie es Spannable

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

sollte um die korrekte Arbeit dieser Besetzung kann. Seine späten tho aber jemand könnte es in der

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

Leider keiner von diesen für mich gearbeitet Zukunft müssen aber nach mit allen Ihren Lösungen Hantieren fand ich etwas, das funktioniert.

Es wird Fehler die textView.getText Gießen(), um Spannable, wenn Sie es als SPANNABLE angeben

Beachten Sie auch von @ CommonsWare Seite:

Beachten Sie, dass Sie nicht wollen, setText() auf der rufen TextView und denkt, dass Sie den Text durch die modifizierte Version ersetzen würden. Sie ändern den TextView-Text in dieser fixTextView() -Methode, und daher ist setText() nicht erforderlich. Schlimmer noch: Wenn Sie android: autoLink verwenden, würde setText() dazu führen, dass Android zurückgeht und URLSpans erneut hinzufügt.

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