Как динамически изменить часть цвета строки с помощью SpannableBuilder - PullRequest
1 голос
/ 16 февраля 2020

Я форматирую строки динамически, как показано в следующем примере из Android документации:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

Затем я устанавливаю значения следующим образом:

var text = getString(R.string.welcome_messages, username, mailCount)

Как установить зеленый цвет для имя пользователя и красный для mailCount ?

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

Ранее я разбивал эту строку на 4 части, а затем мог легко использовать SpannableBuilder для изменения цвета.

HTML и CDATA не подходят. Нам нужно сохранить одинаковые строки для Android и iOS.

Ответы [ 3 ]

1 голос
/ 16 февраля 2020

Вы можете использовать SpannableString и setSpan в зависимости от ваших требований.

<string name="welcome_message">Hello, %1$s! You have %2$d new messages.</string>

void setSpannableTextWithColor(TextView view, int resourceId, String username, int userColor, int messageCount, int countColor) {
    String fulltext = getString(resourceId, username, messageCount);

    view.setText(fulltext, TextView.BufferType.SPANNABLE);
    Spannable str = (Spannable) view.getText();

    int usernameIndex = fulltext.indexOf(username);
    str.setSpan(new ForegroundColorSpan(userColor), usernameIndex, usernameIndex + username.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    int countIndex = fulltext.indexOf(String.valueOf(messageCount));
    str.setSpan(new ForegroundColorSpan(countColor), countIndex, countIndex + String.valueOf(messageCount).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} 

setSpannableTextWithColor(findViewById(R.id.text_view1), R.string.welcome_message, "Viktor Vostrikov", Color.GREEN, 122, Color.RED);
setSpannableTextWithColor(findViewById(R.id.text_view2), R.string.welcome_message, "Виктор Востриков", Color.GREEN, 2, Color.RED);
setSpannableTextWithColor(findViewById(R.id.text_view3), R.string.welcome_message, "فيكتور فوستريكوف", Color.GREEN, 2000, Color.RED);

Выход:

![enter image description here

1 голос
/ 16 февраля 2020

Объявить строку

<string name="string_formatted"><![CDATA[ Hello, <font color=#145A14> %1$s!</font> You have %2$d new messages]]></string>

В действии

TextView tv = findViewById(R.id.mytext);
tv.setText(Html.fromHtml(getString(R.string.html_formatted,"XYZ", 5)));
0 голосов
/ 26 апреля 2020

Используя Jetpack core-ktx , вы можете написать его кратко:

val s = "Beautiful City".toSpannable()

s[0..9] = ForegroundColorSpan(Color.GREEN)
...