带有跨区强制转换的Html.toHtml(ClassCastException)<android> </android>

时间:2014-01-07 22:58:09

标签: java android textview classcastexception spanned

尝试使用HTML格式化输出(在TextView中)。我需要从旧输出中获取文本HTML格式,并在其上方添加一行新文本。

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

这会编译但在toHtml()方法的运行时提供java.lang.ClassCastException:java.lang.String。我看到有几个人认为toHtml()方法可以这样使用,但也许我错过了什么。

3 个答案:

答案 0 :(得分: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被空文本清除怎么办?

答案 1 :(得分: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一起使用解决了原始问题。

然后发生了后续问题,在textview中出现了奇怪的线路制动。原来在这个过程中某处添加了html段代码,手动删除它时,下面是丑陋的解决方案。 当我意识到段落语句中的附加参数是由具有API 18的设备添加时,解决方案变得更加俗气,将我的测试设备与API 8进行了比较。

答案 2 :(得分:0)

同样的问题。必须在转换为Spanned之前创建新的SpannableString。

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