Подтвердить что ты не робот

Android: конвертирование между строками, SpannedStrings и Spannablestrings

У меня есть строковый ресурс, называемый "foo". Это может быть простая строка... или она может содержать HTML. Это может измениться с течением времени: я должен иметь возможность поместить его как по крайней мере SpannableString сразу после чтения, будь то HTML или нет (, но как)

Я хочу получить этот необработанный CharSequence и сначала иметь возможность отображать его как есть (точные символы, а не "интерпретация" этого Android). Прямо сейчас я не могу этого сделать... toString() решает вырвать части, которые, как я думаю, не хочет видеть.

Мне бы хотелось создать SpannableString из этой и других строк или SpannableStrings через конкатенацию с помощью какого-либо метода (ни одна из нормальных не работает). Я хотел бы использовать этот SpannableString для отображения текста в формате HTML в TextView.

Это не должно быть сложно, но ясно, что я не делаю этого правильно (там очень мало информации об этом, что я нашел до сих пор). Несомненно, есть способ точно перевести между строк, SpannedStrings и даже Spannablestrings, не теряя разметки на этом пути?

Заметьте, что я уже играл с несколько сломанным Linkify, но мне нужен лучший контроль над процессом (без зависания неформатированных "/" s, правильных hrefs и т.д.). Я могу заставить все это работать, если я останусь HTML на всех шагах, хотя я не могу ничего конкатенировать.

Изменить 1: я узнал, что могу использовать следующее, чтобы всегда гарантировать, что я получаю свою необработанную строку (вместо того, чтобы Android решил, что это действительно CharSequence). Nice... теперь, как уговорить это в SpannableString?

<string name="foo"><![CDATA[
    <b>Some bold</b>
]]>
</string>

Изменить 2: Не знаю, почему это не срабатывало раньше, но... если foo1 и foo2 являются строками, отмеченными как указано выше (как CDATA), то, по-видимому, можно сделать это:

String foo1 = (String)getResources().getText(R.string.foo1);
String foo2 = (String)getResources().getText(R.string.foo2);
SpannedString bar = new SpannedString(Html.fromHtml(foo1+foo2));

Любопытно: есть ли более простое решение, чем это? Действительно ли это дело CDATA? Это кажется запутанным (но не таким запутанным, как никогда не зная, какой тип ресурса будет... String, Spannable и т.д.)

4b9b3361

Ответ 1

Похоже, что для этого не существует более простого способа.

Ответ 2

У меня была та же проблема. Существует два решения согласно Руководства Google API.

Во-первых, чтобы избежать метки < с &lt; в ресурсе строки. К сожалению, преобразование String удаляет тег в фоновом режиме.

Вторым является использование форматированных строк вместо XML/HTML-тегов. Это кажется более простым, быстрым и уклоняется от проблем с скрытой конверсией. getString(resource, ...) работает как printf(string, ...) здесь.

Оба работают и требуют какого-то кода для замены данной части строки в любом случае (обрабатывать теги или строки форматирования). Наслаждайтесь! =)