Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过参数将Spannable应用于string.xml中的字符串_Android_Xml_String_Spannablestring - Fatal编程技术网

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