Как преобразовать SpannedString в Spannable

Здравствуйте, я установил некоторый текст в текстовом виде.

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

Это не показывает ошибки/предупреждения. Но сброс ошибки Runtime:

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

Как я могу преобразовать SpannedStringt/text текста в Spannble? Или я могу выполнить ту же задачу с SpannedString внутри функции?

Ответ 1

Как преобразовать SpannedStringt/text текстового поля в Spannble?

new SpannableString(textView.getText()) должен работать.

Или я могу выполнить ту же задачу с SpannedString внутри функции?

Извините, но removeSpan() и setSpan() - это методы в интерфейсе Spannable, а SpannedString не реализует Spannable.

Ответ 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);
    }
}

Ответ 3

К сожалению, никто из них не работал у меня, но после того, как я возился со всеми вашими решениями, я нашел что-то, что сработало.

Это приведет к ошибке при переносе textView.getText() в Spannable, если вы не укажете его как SPANNABLE

Также обратите внимание на странице @CommonsWare:

Обратите внимание, что вы не хотите вызывать setText() в TextView, думая, что вы замените текст на модифицированную версию. Вы изменяете текст TextViews в этом методе fixTextView(), поэтому 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);
    }
}

Ответ 4

Если вы указываете BufferType.SPANNABLE при настройке текста TextView, тогда при получении текста вы можете наложить его на Spannable

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