web-dev-qa-db-ja.com

SpannedStringをSpannableに変換する方法

こんにちは私はtextviewにいくつかのテキストを設定しました。

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

これはエラー/警告を示していません。しかし、ランタイムエラーをスローします:

Java.lang.ClassCastException: Android.text.SpannedString cannot be cast to Android.text.Spannable

テキストビューのSpannedStringt/textをSpannbleに変換するにはどうすればよいですか?または、関数内のSpannedStringで同じタスクを実行できますか?

17
Kaidul

テキストビューのSpannedStringt/textをSpannbleに変換するにはどうすればよいですか?

new SpannableString(textView.getText())は機能するはずです。

または、関数内のSpannedStringで同じタスクを実行できますか?

申し訳ありませんが、removeSpan()setSpan()Spannableインターフェースのメソッドであり、SpannedStringSpannableを実装していません。

21
CommonsWare

これは正しい回避策であるはずです。その遅いトーですが、誰かが将来それを必要とするかもしれません

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);
    }
}
2
Jaja weezy

残念ながら、これらのどれも私にはうまくいきませんでしたが、あなたのすべての解決策をいじった後、私はうまくいく何かを見つけました。

SPANNABLEとして指定しない限り、textView.getText()をSpannableにキャストするとエラーが発生します

@CommonsWareのページからも注意してください:

テキストを変更されたバージョンに置き換えることを考えて、TextViewでsetText()を呼び出さないことに注意してください。このfixTextView()メソッドでTextViewのテキストを変更しているため、setText()は必要ありません。さらに悪いことに、Android: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);
    }
}
0
ClayHerendeen