Android - 分解跨区对象

时间:2013-10-13 12:59:45

标签: android spannable spanned

spanned = Html.fromHtml("<sup>aaa</sup>bbb<sub>ccc</sub><b>ddd</b>");

将创建一个包含3个跨度aaacccddd的跨区对象。

bbb被忽略,因为它不在html标记内,

spans = spanned.getSpans(0, spanned.length(), Object.class);

只能确定3个跨度。

我需要一种方法来提取代码的所有4个部分,如果可能的话,将某种数组提取出来,以便我识别每个范围的类型。

3 个答案:

答案 0 :(得分:4)

  

我需要一种方法来提取代码的所有4个部分

Use nextSpanTransition()找到下一个跨度的起点。您的初始位置(第一个参数到nextSpanTransition())和下一个范围之间的字符代表文本的未缩放部分。

您可以查看the source code to the toHtml() method on the Html class以查看此操作。

答案 1 :(得分:0)

'bbb'是不在html标签内的那个。虽然我猜它不会错过。 'ccc'是下标,可能是渲染但不可见。如果限制它,请尝试增加textview高度。

答案 2 :(得分:0)

使用此http://developer.android.com/reference/android/text/Html.html#fromHtml(java.lang.String,android.text.Html.ImageGetter,android.text.Html.TagHandler),为ImageGetter和您的自定义TagHandler传递null

参见示例

String source = "<b>bold</b> <i>italic</i> <unk>unknown</unk>";
TagHandler tagHandler = new TagHandler() {
    Stack<Integer> starts = new Stack<Integer>();
    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
        if (tag.equals("unk")) {
            if (opening) {
                starts.add(output.length());
            } else {
                int start = starts.pop();
                int end = output.length();
                Object what = new Object();
                output.setSpan(what, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    }
};
Spanned spanned = Html.fromHtml(source, null, tagHandler);
TextUtils.dumpSpans(spanned, new LogPrinter(Log.DEBUG, TAG), "span ");