2013-07-26 16 views
12

こんにちはテキストビューでテキストを設定しました。SpannedStringをSpannableに変換する方法

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

その後、私はSpannbleTextViewのテキストを変換する必要があります。私は、これはのようにやったので:

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

私は関数にTextViewを渡されたので、私はそれSpannable変換する必要があります。

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

これは何のエラー/警告を示していません。しかし、ランタイムエラーを投げる:

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

どのように私はスパンテキストにテキストビューのテキストを変換することができますか?または、関数内で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インタフェースのメソッドであり、SpannedStringSpannableを実装していません。

+0

'new SpannableString(textView.getText())' 'textView.getText()'はすでに 'SpannedString'であるため、これは必要ありません。 'textView.getText()'を 'Spannable'に変換する必要があります。何か方法はありますか? –

+1

@typedef:私の答えをもう一度読んでください。 ** SpannableString' **を構築しています。 'SpannableString'は' Spannable'を実装します。 'SpannedString'はしません。 – CommonsWare

+0

Sir、次にテキストビューのテキストの下線をどのように変換できますか?あなたは私にいくつかのヒントを教えてもらえますか? –

-1

TextViewのテキストを設定するときにBufferType.SPANNABLEを指定した場合、テキストを取得するとき、あなたはこれが周りの正しい仕事でなければなりません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

残念ながらどれも私のために働いていない、将来的にそれを必要とするかもしれないが、あなたのソリューションのすべての周りいじるの後に私が働いていた何かを発見しました。あなたは上のsetText()を呼び出す必要はありません

注:SPANNABLE

として

を、それを指定しない限り、

またCommonsWareのページ@からのお知らせSpannableするtextView.getTextを()キャストエラーになりますTextView、あなたは修正されたバージョンでテキストを置き換えると思っています。このfixTextView()メソッドでTextViewのテキストを変更しているため、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); 
    } 
} 
関連する問題