如何在 Android 中格式化和设置样式(粗体、TextSize)字符串资源
How to format and style (Bold, TextSize) string resource in Android
以上是我想使用 String.xml
实现的图像
有三件事
- '76' & '20' 将使用 String.format
动态替换
- '20' 应该是粗体
- '20' 应该大一点
我已经尝试了所有使用 Html.fromHtml class 的解决方案。
以下是我尝试过的解决方案。我可以将“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)
我在谷歌搜索解决方案时遇到了以下链接,但其中 none 对我的情况有效。
- https://developer.android.com/guide/topics/resources/string-resource
- Set TextView style (bold or italic)
我已经尝试了所有我能想到的可能的解决方案,但其中 none 有效。我不知道我缺少什么来实现。如果有人知道如何实现此方案或知道实现此方案的方法,请提供一些相关指导。
您也可以使用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);
}
}
输出
更新
根据您的以下评论
Yes. I could use this but my application also supports Hindi language. And for these localization scenario, I think, using SpannableStringBuilder would be some what difficult to manage
然后像这样在 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);
}
}
您不需要任何 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
来改变,这是相对于原始大小的。
以上是我想使用 String.xml
实现的图像有三件事
- '76' & '20' 将使用 String.format 动态替换
- '20' 应该是粗体
- '20' 应该大一点
我已经尝试了所有使用 Html.fromHtml class 的解决方案。
以下是我尝试过的解决方案。我可以将“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)
我在谷歌搜索解决方案时遇到了以下链接,但其中 none 对我的情况有效。
- https://developer.android.com/guide/topics/resources/string-resource
- Set TextView style (bold or italic)
我已经尝试了所有我能想到的可能的解决方案,但其中 none 有效。我不知道我缺少什么来实现。如果有人知道如何实现此方案或知道实现此方案的方法,请提供一些相关指导。
您也可以使用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);
}
}
输出
更新
根据您的以下评论
Yes. I could use this but my application also supports Hindi language. And for these localization scenario, I think, using SpannableStringBuilder would be some what difficult to manage
然后像这样在 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);
}
}
您不需要任何 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
来改变,这是相对于原始大小的。