Как преобразовать 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();