Как преобразовать 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 из textview в Spannble? Или я могу сделать ту же задачу с SpannedString внутри функции?
4 ответов
как я могу преобразовать SpannedStringt / text из textview в Spannble?
new SpannableString(textView.getText())
должны работать.
или я могу выполнить ту же задачу с SpannedString внутри функции?
Извините, но removeSpan()
и setSpan()
методы на Spannable
интерфейс, и SpannedString
не реализует Spannable
.
Это должна быть правильная работа. Его поздно tho, но кто-то может понадобиться в будущем
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);
}
}
к сожалению, ни один из них не работал для меня, но после возни со всеми вашими решениями я нашел то, что сработало.
это приведет к ошибке литья textView.getText () для Spannable, если вы не укажете его как SPANNABLE
Также обратите внимание на страницу @CommonsWare:
обратите внимание, что вы не хотите вызывать setText() в TextView, думая, что вы замените текст измененной версией. Вы изменяете текст TextView в поместите в этот метод fixTextView (), и поэтому 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);
}
}
если указать BufferType.SPANNABLE
при установке TextView
' s текст, то при получении текста вы можете привести его к Spannable
myTextView.setText("hello", TextView.BufferType.SPANNABLE);
...
...
...
Spannable str = (Spannable) myTextView.getText();