Android 通过参数将Spannable应用于string.xml中的字符串
我在Android 通过参数将Spannable应用于string.xml中的字符串,android,xml,string,spannablestring,Android,Xml,String,Spannablestring,我在String.xml <string name="photo_heading"><xliff:g name="name">%s</xliff:g> shared a <xliff:g name="permission">%s</xliff:g><xliff:g name="photo">%s</xliff:g> with you.</string> 及 现在我将这些样式应用于不同的参数并返回字符
String.xml
<string name="photo_heading"><xliff:g name="name">%s</xliff:g> shared a <xliff:g name="permission">%s</xliff:g><xliff:g name="photo">%s</xliff:g> with you.</string>
及
现在我将这些样式应用于不同的参数并返回字符串,但这不起作用。以下是我正在做的:
public String getHeading(Printrequest printRequest) {
String name = printRequest.sentbyname;
String permission;
String photo;
if (printRequest.mediaobject.permission != null && !printRequest.mediaobject.permission.equalsIgnoreCase("public")) {
permission = printRequest.mediaobject.permission;
} else {
permission = "";
}
if (printRequest.mediaobject.hyperphoto != null) {
photo = " " + getStyledItalic(mContext.getString(R.string.hyperphoto));
} else {
photo = " " + mContext.getString(R.string.photo);
}
String heading = mContext.getString(R.string.photo_heading, getStyledName(name), getStyledItalic(permission), photo);
return heading;
}
我知道我们可以将Spannable
与TextUtils.concat(…)
连接起来,但我的情况不同
解决方案
请检查下面的解决方案@Krislarson解决方案也是另一种方法。以下是如何使用
SpannableStringBuilder
实现这一点。请注意,返回类型已更改为CharSequence
,以容纳生成的Spannable
字符串。您可以将返回值直接传递给TextView.setText()
我需要
TextUtils.expandTemplate(…)
。感谢@pskink的指出和@krislarson的努力
<string name="photo_heading"><xliff:g name="name">^1</xliff:g> shared a<xliff:g name="permission">^2</xliff:g> <xliff:g name="photo">^3</xliff:g> with you.</string>
谢谢你的否决票,但如果你能想出一个解决方案,那就更好了。使用SpannableStringBuilder而不是隐式StringBuilder@pskink您能解释一下我没有使用StringBuilder是什么意思吗?您正在连接两个字符串,它会清除spans@pskink是的,但是在获取字符串时如何连接使用getString(R.string…)方法?所有的困难都是重用getStyledItalic(字符串文本)和getStyledName(字符串名称)方法。我明白了,所以简而言之,我们不能通过字符串中的标记直接应用Spanable?@Shahzeb您可以使用
TextUtils#expandTemplate
在String.xml中使用params,但需要传递“^1”和“^2”,而不是“%s”,等等。在模板中,您不能使用Resource.getString()
,因为这只适用于String
s,而不是CharSequence
s。您确实有Html.fromHtml()
,它接受一个字符串并返回一个跨距
,但它只解析一组非常有限的Html标记。事实上,我认为它可能会识别
以及
和
标记,因此您可能可以使用Html.fromHtml()
来获取标记文本。@Krilason,请参阅我的评论above@pskink啊。确实是的。它不起作用,您不能这样做:“”+getStyledItalic(mContext.getString(R.string.hyperphoto))代码>将以斜体显示cleared@pskink换成CharSequence会有帮助吗?事实上,我没有任何一个箱子可以进入这张支票,所以到目前为止它工作得很好。我不这么认为,但是试试看,在任何一种情况下,你都可以加上空格;你就不能把它放在绳子上吗…name=“permission”>^2@krislarson我可以,但实际上权限是个问题,如果它是“公共”的,我不需要显示任何其他内容来显示权限。所以如果它是公共的,就会出现双空格。
public String getHeading(Printrequest printRequest) {
String name = printRequest.sentbyname;
String permission;
String photo;
if (printRequest.mediaobject.permission != null && !printRequest.mediaobject.permission.equalsIgnoreCase("public")) {
permission = printRequest.mediaobject.permission;
} else {
permission = "";
}
if (printRequest.mediaobject.hyperphoto != null) {
photo = " " + getStyledItalic(mContext.getString(R.string.hyperphoto));
} else {
photo = " " + mContext.getString(R.string.photo);
}
String heading = mContext.getString(R.string.photo_heading, getStyledName(name), getStyledItalic(permission), photo);
return heading;
}
public CharSequence getHeading(Printrequest printRequest) {
String name = printRequest.sentbyname;
String permission;
if (printRequest.mediaobject.permission != null && !printRequest.mediaobject.permission.equalsIgnoreCase("public")) {
permission = printRequest.mediaobject.permission;
} else {
permission = "";
}
String photoHeading = mContext.getString(R.string.photo_heading);
SpannableStringBuilder builder = new SpannableStringBuilder(photoHeading);
int pos = builder.toString().indexOf("%s");
builder.replace(pos, pos+2, getStyledName(name));
pos = builder.toString().indexOf("%s");
builder.replace(pos, pos+2, getStyledItalic(permission));
pos = builder.toString().indexOf("%s");
if (printRequest.mediaobject.hyperphoto != null) {
builder.replace(pos, pos+2, getStyledItalic(mContext.getString(R.string.hyperphoto)));
builder.insert(pos, " ");
} else {
builder.replace(pos, pos+2, mContext.getString(R.string.photo));
builder.insert(pos, " ");
}
return builder;
}
<string name="photo_heading"><xliff:g name="name">^1</xliff:g> shared a<xliff:g name="permission">^2</xliff:g> <xliff:g name="photo">^3</xliff:g> with you.</string>
public CharSequence getHeading(Printrequest printRequest) {
String name = printRequest.sentbyname;
String permission;
CharSequence photo;
if (printRequest.mediaobject.permission != null && !printRequest.mediaobject.permission.equalsIgnoreCase("public")) {
permission = " " + printRequest.mediaobject.permission;
} else {
permission = "";
}
if (printRequest.mediaobject.hyperphoto != null) {
photo = getStyledItalic(mContext.getString(R.string.hyperphoto));
} else {
photo = mContext.getString(R.string.photo);
}
return TextUtils.expandTemplate(mContext.getString(R.string.photo_heading), getStyledName(mContext, name), getStyledItalic(permission), photo);
}