您好我在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
如何将textview的SpannedStringt / text转换为Spannble?或者我可以在函数内部使用SpannedString执行相同的任务吗?
答案 0 :(得分:20)
如何将textview的SpannedStringt / text转换为Spannble?
new SpannableString(textView.getText())
应该有用。
或者我可以在函数内部使用SpannedString执行相同的任务吗?
抱歉,removeSpan()
和setSpan()
是Spannable
界面上的方法,SpannedString
未实现Spannable
。
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
不幸的是,这些都不适合我,但在摆弄了所有解决方案之后,我发现了一些有效的方法。
将textView.getText()强制转换为Spannable,除非您将其指定为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);
}
}
答案 3 :(得分:-1)
如果您在设置BufferType.SPANNABLE
的文字时指定TextView
,那么在获取文字时您可以将其投放到Spannable
myTextView.setText("hello", TextView.BufferType.SPANNABLE);
...
...
...
Spannable str = (Spannable) myTextView.getText();