Как отформатировать и стилизовать (Bold, TextSize) строковый ресурс в Android - PullRequest
0 голосов
/ 15 декабря 2018

enter image description here

Выше приведено изображение того, чего я хочу достичь с помощью String.xml

Есть три вещи

  1. '76 'и' 20 'будут заменены динамически с использованием String.format
  2. '20' должно быть выделено жирным шрифтом
  3. '20 'должно быть больше по размеру

Я испробовал все решения с использованием класса Html.fromHtml.

Ниже приведены решения, которые я попробовал.Я могу выделить «20» жирным шрифтом, но не могу увеличить размер «20».

Ниже приведены различные варианты String.xml, которые я пробовал

<string name="points_data">Use %1$d points= &lt;font size="30">₹ %2$d&lt;/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= &lt;font size="14">&lt;b>₹ %2$d&lt;/b>&lt;/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= &lt;b>&lt;span style="fontSize='50'">₹ %2$d&lt;/span>&lt;/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)

Я натолкнулся на следующие ссылки во время поиска решения, но ни одна из них не работает для моего случая.

  1. https://developer.android.com/guide/topics/resources/string-resource
  2. Установить стиль TextView (жирный или курсив)
  3. Html.fromHtml устарел в Android N

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

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вам не нужно никакого 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 относительно исходного размера.

0 голосов
/ 15 декабря 2018

Вы также можете использовать SpannableStringBuilder для достижения требуемого результата

SAMPLE CODE

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);
    }

}

ВЫХОД

enter image description here

ОБНОВЛЕНИЕ

согласно вашему комментарию ниже

Да,Я мог бы использовать это, но мое приложение также поддерживает язык хинди.И для этого сценария локализации, я думаю, использование 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);
    }

}
...