Как разделить SpannableStringBuilder, сохранив его форматирование?
Я работаю над проектом Android, который включает анализ некоторого HTML (проанализированного Jsoup) в класс SpannableStringBuilder.
Однако мне нужно, чтобы этот класс SpannableStringBuilder был разделен каждым символом новой строки на List после того, как он завершил синтаксический анализ, сохраняя его форматирование.
Такой, что натянутый текст
{"Я натянутый текст,\ n слышу, как я реву"}
превратится в
{"Я натянутый текст", "услышь меня рев"}
Я довольно новичок в разработке под Android и не смог найти в документации ничего о том, как разбрызгивать промежутки или даже получить список всего форматирования в составном классе для создания своего собственного. Поэтому любая помощь очень ценится.
1 ответ
Мне удалось выяснить это самостоятельно, изучив метод, предложенный 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;
}