Как создать Стилизованный текст для TextView при сборке строки? - PullRequest
3 голосов
/ 13 июля 2010

У меня есть TextView, который будет содержать стилизованную многострочную строку. Этот текст генерируется построчно, так как данные берутся из разных источников по крупицам. Когда я беру каждое поле, я добавляю заголовок Bold в TextView на новой строке, затем я добавляю данные для этого поля курсивом на новой строке.

Пример форматирования:

Срок исполнения
22 июля 2010 г.
Курс
CSC 350

Я мог бы установить стиль так:

Spannable str = (Spannable) textview.getText();

str.setSpan(new StyleSpan(android.graphics.Typeface.Bold), 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.Italic), 8, 21, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.Bold), 21, 27, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.Italic), 27, 33, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Но для этого необходимо знать длину каждого раздела текста во время выполнения, что просто неуправляемо, поскольку в текстовое представление можно добавить переменное количество полей данных.

Как добавить стиль, когда я добавляю каждый фрагмент текста, а не после того, как весь текст был добавлен?

Ответы [ 6 ]

3 голосов
/ 13 июля 2010

Пометьте свою строку тегами <b> и <i>, в зависимости от ситуации, а затем используйте Html.fromHtml (String) , чтобы вернуть искомый Spannable.

2 голосов
/ 31 января 2017

Html.fromHtml(String) несет с собой гораздо больше багажа, чем более легкие SpannableString классы. Когда бы ни было возможно, я бы порекомендовал вам избегать fromHtml для стилизации строки.

В вашем случае вы можете построить строку с помощью SpannableStringBuilder, а затем установить текст TextView с последней стилизованной строкой.

// set the text
SpannableString s1 = new SpannableString("Due Date\n");
SpannableString s2 = new SpannableString("July 22, 2010\n");
SpannableString s3 = new SpannableString("Course\n");
SpannableString s4 = new SpannableString("CSC 350\n");

// set the style
s1.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s2.setSpan(new StyleSpan(Typeface.ITALIC), 0, s2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s3.setSpan(new StyleSpan(Typeface.BOLD), 0, s3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s4.setSpan(new StyleSpan(Typeface.ITALIC), 0, s4.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

// build the string
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(s1);
builder.append(s2);
builder.append(s3);
builder.append(s4);

// set the text view with the styled text
textView.setText(builder);

Я устанавливаю текст и стили один за другим, но при реальном использовании это легко сделать в цикле. Вот результат:

enter image description here

0 голосов
/ 19 декабря 2014

Я знаю, что этот вопрос несколько устарел, но, поскольку он является лучшим в Google, я хотел бы добавить страницу разработчика в качестве хорошего ресурса для этого.Внизу содержатся подсказки для вспомогательных методов для программного оформления текста.

0 голосов
/ 24 января 2012

Вы должны проверить, как класс HTML делает это.Я бы проанализировал входные данные и сгенерировал бы готовый к использованию на лету.

0 голосов
/ 27 марта 2011

Вы можете установить Spannable в качестве текста TextView. Таким образом, вы можете сначала создать свой текст, добавить информацию о стиле, когда это необходимо, и поместить ее в TextView в зависимости от ситуации.

0 голосов
/ 27 января 2011

Вы можете использовать это:

textview.setTypeface(null, Typeface.BOLD_ITALIC);
...