2014-01-07 1 views
1

Попытка форматирования моего вывода (в TextView) с использованием HTML. Мне нужно получить текст HTML-форматирование обратно из старого вывода и добавить новый текст на одну строку над ним.Html.toHtml with Spanned cast (ClassCastException) <Android>

String previous = Html.toHtml((Spanned) chatOutput.getText()); 
chatOutput.setText(Html.fromHtml(message + "<br>" + previous)); 

компилируется, но дает java.lang.ClassCastException: java.lang.String во время выполнения в методе toHtml(). Я видел нескольких людей, которые предположили, что метод toHtml() может использоваться таким образом, но, возможно, я что-то упускаю.

+0

Исключение происходит в «(Составной) chatOutput.getText()», я думаю, что объект, возвращаемый chatOutput.getText() является Spannable и не натянутый ... –

ответ

0
TextView chatOutput = (TextView) findViewById(R.id.textView4); 
chatOutput.setText("", BufferType.SPANNABLE); 

void updateChatOutput { 
    String previous = Html.toHtml((Spannable) chatOutput.getText()); 
    if (!previous.equals("")) { 
     if (previous.substring(0, 13).equals("<p dir=\"ltr\">")) 
      previous = previous.substring(13, previous.length()-3); //remove <p dir="ltr"> and </p> 
     else 
      previous = previous.substring(3, previous.length()-3); //remove <p> and </p> 
    } 
    chatOutput.setText(Html.fromHtml(message.substring(2, message.length()) + "<br>" + previous)); 
} 

Обдумал это. Изменение приведения в Spannable и использование метода setText с BufferType.SPANNABLE решает основную проблему.

После этого возникла следующая проблема, странная линия торможения в текстовом виде. Оказалось, что код html-para был добавлен где-то в этом процессе, уродливое решение ниже, когда его вручную удаляет. Решение стало еще более липким, когда я понял, что дополнительные параметры в абзаце-заявлении были добавлены устройством с API 18, сравнили мое тестовое устройство с API 8.

1

Из документации по Gettext()

Return the text the TextView is displaying. If setText() was called with an argument of BufferType.SPANNABLE or BufferType.EDITABLE, you can cast the return value from this method to Spannable or Editable,

Таким образом, вы можете бросить его, но я бы еще проверить с InstanceOf, если это безопасно, а что если TextView был очищен с пустым текстом?

+0

я заметил, что при переходе на 'строку previous = Html.toHtml ((Spannable) chatOutput.getText()); 'и с этим выражением' chatOutput.setText ("", BufferType.SPANNABLE); 'после инициализации textviews заставил его работать. Несмотря на то, что жирная формация и т. Д. Работает так, как ожидалось, я столкнулся с каким-то последующим неожиданным поведением. Существует гораздо больше межстрочного интервала между строками теперь в текстовом окне, чем раньше, даже когда вы полностью удаляете
, есть как двойной ввод между каждой строкой, хотя в этом случае должен быть разрыв строки! Кто-нибудь видел, что случилось? – Cander

0

Такая же проблема. Пришлось создать новую SpannableString перед тем, как наложить на Spanned.

Spanned spannedText = new SpannableString(textView.getText()); 
String htmlString = Html.toHtml(spannedText);