在开发中,如果遇到如下listview的item布局
以前总是把“物料名称:”作为一个TextView,后面具体值作为一个TextView。这样做使得布局变得很繁琐。后来发现可以使用占位符%1$s使其变成一个TextView,使得布局变得简单。
1.在strings.xml中定义<string name="material_name">物料名称:%1$s</string>
2.在布局TextView中引入
<TextView
android:id="@+id/tv_material_name"
style="@style/text_delivery_order"
android:text="@string/material_name"/>
3.在Java代码中进行赋值
.setText(String.format(getResources().getString(R.string.material_name),"食用油"));
下面是封装的String.format()方法:
public static String stringFromat(Context context, int sId, Object... args) {
if (sId == 0 || args == null)
return null;
return String.format(context.getResources().getString(sId), args);
}
扩展:还可以添加多个占位符<string name="my">我叫:%1$s,我来自%2$s,我做%3$s工作</string>
.setText(String.format(getResources().getString(R.string.my),"小明","北京","程序员");
常用的有:
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00
(注:m放置空格,并不代表m是几,就是几个空格,具体看实际效果)
补充:
在string.xml中可以加入 HTML元素:<b>表示粗文本 <i>表示斜体文本 <u>表示下划线文本 ,但是如果使用占位符format的时候,会出现失效的情况。需要使用 htmlEncode(String) 对用于带格式文本的字符串中任何可能的 HTML 字符进行转义。如果您向 String.format() 传递的字符串参数可能包含“<”或“&”之类的字符,则必须在设置格式前进行转义,这样在通过 fromHtml(String) 传递带格式字符串时,字符就能以原始形式显示出来。
<string name="audit_title_str"><u> %1$s </u>量化审核工作指南</string>
String escapedUsername = TextUtil.htmlEncode(username);
Resources res = getResources();
String text = String.format(res.getString(R.string.audit_title_str), escapedUsername);
.setText(Html.fromHtml(text));
空格:  <: < >:>