首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Android中使用带占位符的格式化字符串?

如何在Android中使用带占位符的格式化字符串?
EN

Stack Overflow用户
提问于 2014-05-07 03:48:05
回答 7查看 24.1K关注 0票数 65

在Android中,可以在字符串中使用占位符,例如:

代码语言:js
复制
My number is %1$d

然后在Java代码中(在Activity):

代码语言:javascript
复制
String res = getString(R.string.number);
String formatted = String.format(res, 5);

或者更简单:

代码语言:js
复制
String formatted = getString(R.string.number, 5);

也可以在Android字符串资源中使用一些HTML标记:

代码语言:js
复制
Underline example

由于String本身不能包含有关格式的任何信息,应使用getText(int)而不是getString(int)方法:

代码语言:js
复制
CharSequence formatted = getText(R.string.underline);

返回的CharSequence然后可以传递给Android小部件,例如TextView,标记的短语将加下划线。

但是,我找不到如何结合这两种方法,使用带占位符的格式化字符串:

代码语言:js
复制
My number is %1$d

如何在Java代码中处理上述资源以将其显示在TextView,替换为%1$d用一个整数?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-05-09 18:57:44

最后,我设法找到了一个可行的解决方案,并编写了自己的方法来替换占位符,保留格式:

代码语言:javascript
复制
public static CharSequence getText(Context context, int id, Object... args) {
    for(int i = 0; i < args.length; ++i)
        args[i] = args[i] instanceof String? TextUtils.htmlEncode((String)args[i]) : args[i];
    return Html.fromHtml(String.format(Html.toHtml(new SpannedString(context.getText(id))), args));
}

这种方法既不需要在格式化的字符串中手动转义HTML标记,也不需要在替换占位符的字符串中手动转义。

票数 34
EN

Stack Overflow用户

发布于 2019-07-09 09:03:13

Kotlin扩展函数

  • 适用于所有API版本
  • 处理多个参数

示例用法

代码语言:js
复制
textView.text = context.getText(R.string.html_formatted, "Hello in bold")

包装在CDATA节中的HTML字符串资源

代码语言:js
复制
%1$s]]>

结果

粗体文本:用粗体表示的Hello

代码

代码语言:javascript
复制
/**
* Create a formatted CharSequence from a string resource containing arguments and HTML formatting
*
* The string resource must be wrapped in a CDATA section so that the HTML formatting is conserved.
*
* Example of an HTML formatted string resource:
* %1$s ]]>
*/
fun Context.getText(@StringRes id: Int, vararg args: Any?): CharSequence =
    HtmlCompat.fromHtml(String.format(getString(id), *args), HtmlCompat.FROM_HTML_MODE_COMPACT)
票数 20
EN

Stack Overflow用户

发布于 2014-05-07 03:55:11

代码语言:javascript
复制
Hello, %1$s! You have %2$d new messages.



Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
CharSequence styledText = Html.fromHtml(text);

更多信息请点击此处:http://developer.android.com/guide/topics/resources/string-resource.html

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23503642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档