Android 使文本视图';以粗体和常规文本显示内容

Android 使文本视图';以粗体和常规文本显示内容,android,textview,bold,Android,Textview,Bold,我正在使用textview来保存来自web服务的字符串。字符串的格式如下。“示例文本{{b}}粗体文本{{/b}}等等”。我需要在我的文本视图中显示粗体文本。在一次操作中,我只能传递字符串。我是否有机会使用带有颜色、字体等属性的字符串 注意:我在解析文本方面没有问题,我只是想找到一种方法将解析后的文本传递给textview 感谢您在文本视图中设置文本,然后使用: mytextview.setText(Html.fromHtml(sourceString)); 然后您将获得实际格式的文本。我使用

我正在使用textview来保存来自web服务的字符串。字符串的格式如下。“示例文本{{b}}粗体文本{{/b}}等等”。我需要在我的文本视图中显示粗体文本。在一次操作中,我只能传递字符串。我是否有机会使用带有颜色、字体等属性的字符串

注意:我在解析文本方面没有问题,我只是想找到一种方法将解析后的文本传递给textview


感谢您在文本视图中设置文本,然后使用:

mytextview.setText(Html.fromHtml(sourceString));

然后您将获得实际格式的文本。

我使用SpannableString解决了这个问题,对于需要代码的人,可以根据自己的意愿更改这个类

public class RichTextHelper {
public static SpannableStringBuilder getRichText(String text){
    SpannableStringBuilder builder=new SpannableStringBuilder();     
    String myText=text;
    boolean done=false;
    while(!done){
        if((myText.indexOf("{{b}}")>=0) && (myText.indexOf("{{b}}")<myText.indexOf("{{/b}}"))){
            int nIndex=myText.indexOf("{{b}}");
            String normalText=myText.substring(0,nIndex);
            builder.append(normalText);
            myText=myText.substring(nIndex+5);
        }else if((myText.indexOf("{{/b}}")>=0)){        
            int bIndex=myText.indexOf("{{/b}}");
            String boldText=myText.substring(0,bIndex);
            builder.append(boldText);

            myText=myText.substring(bIndex+6);
            int start=builder.length()-bIndex-1;
            int end =builder.length();//-1;
            if((start>=0) && (end>start)){
                builder.setSpan(new StyleSpan(Typeface.BOLD), start, end, 0);
            }

        }else{
            if(myText.contains("{{/b}}"))
                myText=myText.replace("{{/b}}", "");
            builder.append(myText);
            done=true;
        }
    }

    return builder;
}
公共类RichTextHelper{
公共静态SpannableStringBuilder getRichText(字符串文本){
SpannableStringBuilder=新的SpannableStringBuilder();
字符串myText=text;
布尔完成=假;
而(!完成){
如果((myText.indexOf(“{b}”)>=0)和((myText.indexOf({b}”)=0)){
int bIndex=myText.indexOf(“{/b}”);
字符串boldText=myText.substring(0,bIndex);
builder.append(粗体文本);
myText=myText.substring(bIndex+6);
int start=builder.length()-bIndex-1;
int end=builder.length();/-1;
如果((开始>=0)和(&(结束>开始)){
builder.setSpan(新样式span(Typeface.BOLD),开始,结束,0);
}
}否则{
if(myText.contains(“{/b}”))
myText=myText.replace(“{/b}}”,即“”);
builder.append(myText);
完成=正确;
}
}
返回生成器;
}

}

我认为选择的答案没有提供令人满意的结果。我已经写了我自己的函数,它需要2个字符串;全文和要加粗的部分文本

它返回一个SpannableStringBuilder,其中“text”中的“textToBold”以粗体显示

我发现不使用标记将子字符串加粗的功能非常有用

/**
 * Makes a substring of a string bold.
 * @param text          Full text
 * @param textToBold    Text you want to make bold
 * @return              String with bold substring
 */

public static SpannableStringBuilder makeSectionOfTextBold(String text, String textToBold){

    SpannableStringBuilder builder=new SpannableStringBuilder();

    if(textToBold.length() > 0 && !textToBold.trim().equals("")){

        //for counting start/end indexes
        String testText = text.toLowerCase(Locale.US);
        String testTextToBold = textToBold.toLowerCase(Locale.US);
        int startingIndex = testText.indexOf(testTextToBold);
        int endingIndex = startingIndex + testTextToBold.length();
        //for counting start/end indexes

        if(startingIndex < 0 || endingIndex <0){
            return builder.append(text);
        }
        else if(startingIndex >= 0 && endingIndex >=0){

            builder.append(text);
            builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0);
        }
    }else{
        return builder.append(text);
    }

    return builder;
/**
*使字符串的子字符串加粗。
*@param text全文
*@param Text要加粗的旧文本
*@带粗体子字符串的返回字符串
*/
public static SpannableStringBuilder makeSectionOfTextBold(String-text,String-textToBold){
SpannableStringBuilder=新的SpannableStringBuilder();
如果(textToBold.length()>0&!textToBold.trim()等于(“”){
//用于计算开始/结束索引
String testText=text.toLowerCase(Locale.US);
String testTextToBold=textToBold.toLowerCase(Locale.US);
int startingIndex=testText.indexOf(testTextToBold);
int-endingIndex=startingIndex+testTextToBold.length();
//用于计算开始/结束索引
如果(起始索引<0 | |结束索引=0和结束索引>=0){
builder.append(文本);
builder.setSpan(新样式span(Typeface.BOLD),起始索引,结束索引,0);
}
}否则{
返回builder.append(文本);
}
返回生成器;

}

这是一个复制品,它似乎有一个bug。第一个{{b}}被忽略。必须具有int start=builder.length()-bIndex/*-1*/;