Как отформатировать и стилизовать (Bold, TextSize) строковый ресурс в Android
Выше приведено изображение того, чего я хочу достичь с помощью String.xml
Есть три вещи
- '76' и '20' будут заменены динамически с использованием String.format
- "20" должно быть выделено жирным шрифтом
- "20" должно быть больше по размеру
Я перепробовал все решения с использованием класса Html.fromHtml.
Ниже приведены решения, которые я попробовал. Я могу сделать "20" жирным шрифтом, но не могу сделать "20" больше по размеру.
Ниже приведены различные варианты String.xml, которые я пробовал
<string name="points_data">Use %1$d points= <font size="30">₹ %2$d</font> in payment</string>
<string name="points_data">Use %1$d points= <font size="14"><b>₹ %2$d</b></font> in payment</string>
<string name="points_data">Use %1$d points= <font size="14"><b>₹ %2$d</b></font> in payment</string>
<string name="points_data"><![CDATA[Use %1$d points= <font size="60"><b>₹ %2$d</b></font> in payment]]></string>
<string name="points_data">Use %1$d points= <b><span style="fontSize='50'">₹ %2$d</span></b> in payment</string>
Ниже приведен метод, который я использую для разбора строки выше
val formattedText = String.format(getString(R.string.points_data), 76, 20)
textViewPoints.text = HtmlCompat.fromHtml(formattedText, HtmlCompat.FROM_HTML_MODE_LEGACY)
Я наткнулся на следующие ссылки во время поиска решения, но ни одна из них не работает для моего случая.
- https://developer.android.com/guide/topics/resources/string-resource
- Установить стиль TextView (жирный или курсив)
- Html.fromHtml устарел в Android N
Я перепробовал все возможные решения, которые мог придумать, но ни одно из них не работает. Я не знаю, чего мне не хватает для реализации. Если кто-то знает, как достичь этого сценария или знает, как этого добиться, пожалуйста, предоставьте некоторые рекомендации относительно этого.
2 ответа
Вам не нужно HTML-форматирование, поэтому вам нужен только простой текст в строковых ресурсах, например так:
<string name="points_data">Use %1$d points= ₹%2$d in payment</string>
Вы можете использовать SpannableString
, чтобы отформатировать 2-й параметр вашего строкового ресурса.
И то и другое "%1$d"
а также "%2$d"
будет просто заполнителями, так что не используйте String.format()
в этом случае:
val param1 = 20.toString()
val param2 = 70.toString()
var str = getString(R.string.points_data).replace("%1\$d", param1)
val index = str.indexOf("%2\$d")
val len = param2.length
str = str.replace("%2\$d", param2)
val sp = SpannableString(str)
sp.setSpan(StyleSpan(Typeface.BOLD), index, index + len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
sp.setSpan(RelativeSizeSpan(1.5f), index, index + len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
Теперь, если вы хотите установить текст TextView
:
tv.text = sp
Размер текста может быть изменен путем изменения 1.5f
, что относительно исходного размера.
Вы также можете использовать SpannableStringBuilder
достичь желаемого результата
ОБРАЗЕЦ КОДА
public class MainActivity extends AppCompatActivity {
TextView tvTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvTextView = findViewById(R.id.tvTextView);
setSpan("76", "20");
}
public void setSpan(String priceOne, String priceTwo) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("Use ");
spannableStringBuilder.append(priceOne);
SpannableString text = new SpannableString("$" + priceTwo);
text.setSpan(new RelativeSizeSpan(1.5f), 0, text.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableStringBuilder.append(" Points =");
spannableStringBuilder.append(text);
spannableStringBuilder.append(" in Payment");
tvTextView.setText(spannableStringBuilder);
}
}
ВЫХОД
ОБНОВИТЬ
согласно вашему ниже комментарию
Да. Я мог бы использовать это, но мое приложение также поддерживает язык хинди. И для этого сценария локализации, я думаю, использование SpannableStringBuilder было бы чем-то сложным в управлении
Чем добавить свой strings
в res/values/string.xml
как это
<resources>
<string name="app_name"> Demo App</string>
<string name="search">Search</string>
<string name="str_use">Use</string>
<string name="str_points">Points =</string>
<string name="str_payment">in Payment</string>
</resources>
Чем использовать как это
public class MainActivity extends AppCompatActivity {
TextView tvTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvTextView = findViewById(R.id.tvTextView);
setSpan("76", "20");
}
public void setSpan(String priceOne, String priceTwo) {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getString(R.string.str_use));
spannableStringBuilder.append(priceOne);
SpannableString text = new SpannableString("$" + priceTwo);
text.setSpan(new RelativeSizeSpan(1.5f), 0, text.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableStringBuilder.append(getString(R.string.str_points));
spannableStringBuilder.append(text);
spannableStringBuilder.append(getString(R.string.str_payment));
tvTextView.setText(spannableStringBuilder);
}
}