0

我正在开发一个涉及将一些 HTML(由 Jsoup 解析)解析为 SpannableStringBuilder 类的 android 项目。

但是,一旦完成解析,我需要将这个 SpannableStringBuilder 类按每个换行符划分为一个列表,同时保持其格式。

这样一个跨越的文本

{“我是一个跨文本, \n 听我咆哮”}

会变成

{“我是一个跨文本, ”“我咆哮”}

我对在 Android 上进行开发相当陌生,并且在文档中找不到关于吐出跨度的任何内容,甚至找不到跨跨类上所有格式的列表来构建我自己的。因此,非常感谢任何帮助。

4

1 回答 1

2

在研究了 pskink 建议的方法后,我设法自己解决了这个问题。

我对此的解决方案是

@Override
    public List<Spanned> parse() {
        List<Spanned> spans = new ArrayList<Spanned>();
        Spannable unsegmented = (Spannable) Html.fromHtml(base.html(), null, new ReaderTagHandler());
        //Set ColorSpan because it defaults to white text color
        unsegmented.setSpan(new ForegroundColorSpan(Color.BLACK), 0, unsegmented.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

        //get locations of '/n'
        Stack<Integer> loc = getNewLineLocations(unsegmented);
        loc.push(unsegmented.length());

        //divides up a span by each new line character position in loc
        while (!loc.isEmpty()) {
            Integer end = loc.pop();
            Integer start = loc.isEmpty() ? 0 : loc.peek();

            spans.add(0,(Spanned) unsegmented.subSequence(start, end));
         }

        return spans;
    }

    private Stack<Integer> getNewLineLocations(Spanned unsegmented) {
        Stack<Integer> loc = new Stack<>();
        String string = unsegmented.toString();
        int next = string.indexOf('\n');
        while (next > 0) {
            //avoid chains of newline characters
            if (string.charAt(next - 1) != '\n') {
                loc.push(next);
                next = string.indexOf('\n', loc.peek() + 1);
            } else {
                next = string.indexOf('\n', next + 1);
            }
            if (next >= string.length()) next = -1;
        }
        return loc;
    }
于 2016-06-20T01:37:56.423 回答