【问题标题】:How to format and style (Bold, TextSize) string resource in Android如何在Android中格式化和样式(Bold,TextSize)字符串资源
【发布时间】:2019-05-16 11:35:51
【问题描述】:

上面是我想要使用 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. Set TextView style (bold or italic)
  3. Html.fromHtml deprecated in Android N

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

【问题讨论】:

    标签: android string textview string.xml textstyle


    【解决方案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 会有些难以管理

    比像这样在res/values/string.xml 中添加您的strings

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

    【讨论】:

    • 是的。我可以使用它,但我的应用程序也支持印地语。对于这些本地化场景,我认为使用 SpannableStringBuilder 会有些难以管理。
    • @Dhaval 很高兴能帮上忙!如果您觉得它对您有用,请随时 accept my answer。 ?
    【解决方案2】:

    你不需要任何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)
    

    现在如果你想设置TextView的文本:

    tv.text = sp
    

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

    【讨论】:

    • 谢谢。我对在您的代码中使用 BOLD 进行了更改,它可以正常工作。我想我找到了解决方案。
    • 如果你的意思是 StyleSpan(Typeface.BOLD) 你是对的。这是一个错字,我编辑了。
    • 是的,我是这个意思。感谢您的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多