1

在此处输入图像描述

以上是我想要使用 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. Android N 中不推荐使用 Html.fromHtml

我已经尝试了我能想到的所有可能的解决方案,但没有一个有效。我不知道我缺少什么来实现。如果有人知道如何实现此场景或知道实现此目的的方法,请提供一些相关指导。

4

2 回答 2

1

您还可以使用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 会有些难以管理

比像这样添加你stringsres/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);
    }

}
于 2018-12-15T13:14:04.293 回答
1

您不需要任何 html 格式,因此您只需要字符串资源中的纯文本,如下所示:

<string name="points_data">Use %1$d points= ₹%2$d in payment</string> 

您可以使用SpannableString, 来格式化字符串资源的第二个参数。
两者"%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)

现在,如果您想设置 a 的文本TextView

tv.text = sp

文本的大小可以通过改变来改变1.5f,这是相对于原始大小的。

于 2018-12-15T13:39:43.880 回答