SpannableStringBuilder创建具有多种字体/文本大小等示例串?SpannableS

2019-05-16 18:11发布

我需要创建放置在一个TextView,将显示一个像这样的字符串的字符串:

第一部分非粗体BOLD休息不够大胆

所以我想知道我怎么能使用SpannableStringBuilder做到这一点?

我可以用三个文本编辑做到这一点,但我想用最好的解决方案。

Answer 1:

First Part Not Bold   BOLD  rest not bold

你可以这样做,因为@Rajesh建议或本。

String normalBefore= "First Part Not Bold ";
String normalBOLD=  "BOLD ";
String normalAfter= "rest not bold";
String finalString= normalBefore+normalBOLD+normalAfter;
Spannable sb = new SpannableString( finalString );
sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), finalString.indexOf(normalBOLD)+ normalBOLD.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //bold
sb.setSpan(new AbsoluteSizeSpan(intSize), finalString.indexOf(normalBOLD)+ normalBOLD.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//resize size

在TextView中显示此

textview.setText(sb,  TextView.BufferType.SPANNABLE);


Answer 2:

接受的答案是好的(我upvoted它),但它无法使用SpannableStringBuilder按要求提交。 正如我曾在那里建造是最有意义的情况下,这里是该代码(与奖金的使用也改变了文本的颜色,如果这是帮助他人)。 请注意,您也可以提供初始字符串到SpannableStringBuilder构造,但我将在这里使用“追加”明确的是,您可以附加很多之前你想要的“大胆”的文本,然后只是记录开始,如图所示。 我怀疑这是不是接受的答案也更快的代码。

SpannableStringBuilder longDescription = new SpannableStringBuilder();
longDescription.append("First Part Not Bold ");
int start = longDescription.length();
longDescription.append("BOLD");
longDescription.setSpan(new ForegroundColorSpan(0xFFCC5500), start, longDescription.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
longDescription.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, longDescription.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
longDescription.append(" rest not bold");


Answer 3:

从API 21 SpannableStringBuilder包括一个简单的方法来做到这一点。 这里是一个溶液例如:

SpannableStringBuilder builder= new SpannableStringBuilder();
StyleSpan boldSpan = new StyleSpan(android.graphics.Typeface.BOLD);
builder.append("First Part Not Bold ")
              .append("BOLD ", boldSpan, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
              .append("rest not bold");

由于这是一个很好的机会,你不支持API 21只,你可以从该方法复制的代码:

public SpannableStringBuilder append(CharSequence text, Object what, int flags) {
        int start = length();
        append(text);
        setSpan(what, start, length(), flags);
        return this;
}


Answer 4:

如果您使用的科特林你可以使用下面的Android的KTX库

val s = SpannableStringBuilder()
        .append("First Part Not Bold ")
        .bold { append("BOLD") } 
        .append("Rest not bold")

bold是一个扩展功能SpannableStringBuilder 。 你可以看到文档在这里你可以使用操作的列表。

另一个例子:

val s = SpannableStringBuilder()
            .color(green, { append("Green text ") })
            .append("Normal text ")
            .scale(0.5, { append("Text at half size " })
            .backgroundColor(green, { append("Background green") })

其中green是解决了RGB色彩。

它甚至可以嵌套跨越所以你最终与嵌入式DSL:

bold { underline { italic { append("Bold and underlined") } } }

您需要在您的应用程序模块级别以下build.gradle为它工作:

repositories {
    google()
}

dependencies {
    implementation 'androidx.core:core-ktx:0.3'
}


Answer 5:

通过使用HTML代码的TextView Html类:

Spanned styledText = Html.fromHtml("First Part Not Bold <b>BOLD</b> rest not bold");
textView.setText(styledText);


Answer 6:

此代码应设置为自带的HTML大胆标签内大胆一切。 而且它还会删除所以只有里面的内容显示在标签。

        SpannableStringBuilder sb = new SpannableStringBuilder("this is <b>bold</b> and this is <b>bold too</b>  and this is <b>bold too, again</b>.");

        Pattern p = Pattern.compile("<b>.*?</b>", Pattern.CASE_INSENSITIVE);            
        boolean stop = false;
        while (!stop)
        {
            Matcher m = p.matcher(sb.toString());
            if (m.find()) {
                sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                sb.delete(m.end()-4, m.end());
                sb.delete(m.start(), m.start() + 3);
            }
            else
                stop = true;
        }

这种代码也可以适用于其他HTML样式的标记,如标(SUP标签)等。

        SpannableStringBuilder sb = new SpannableStringBuilder("text has <sup>superscript</sup> tag");

        Pattern p = Pattern.compile("<sup>.*?</sup>", Pattern.CASE_INSENSITIVE);            
        boolean stop = false;
        while (!stop)
        {
            Matcher m = p.matcher(sb.toString());
            if (m.find()) {
                sb.setSpan(new SuperscriptSpan(), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                sb.delete(m.end()-6, m.end());
                sb.delete(m.start(), m.start() + 5);
            }
            else
                stop = true;
        }

要设置颜色,只需使用与setSpan的ForegroundColorSpan。

sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

希望能帮助到你。



Answer 7:

所以我知道这已经得到解决,甚至与SpannableStringBuilder要求,但在事件你想更多的动态我想我会把这件事建立一个字符串。

// Stuff needed
TextView DataTextView = (TextView)rootView.findViewById(R.id.DataView);
String Fields[] = {...database column names as strings... "x","y"};

String DataString = new String();   

int start,stop;     // Start and Stop of formatting

// Final Result
SpannableStringBuilder coloredString = new SpannableStringBuilder(); 

SpannableString temp;       // Small segment of colored string
for (int i =0; i < Fields.length; i++)
{
    if (database_result.containsKey(Fields[i]))  // Be sure a field exists in the ContentValues
    {
            DataString = Fields[i]+": ";
        start = DataString.length();
        DataString = DataString+ +database_result.getAsInteger(Fields[i])+" ";
        stop= DataString.length();
        temp = new SpannableString(DataString);
        temp.setSpan(new ForegroundColorSpan(Color.WHITE),start, stop, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        coloredString.append(temp);
    }   
}
DataTextView.setText(coloredString);

database_result是我从返回的游标类型的SQL查询的构建的ContentValues类型。 我曾与此唯一的问题是在一开始只是ColorSpaning第一段。 它接缝,你需要要使用一个(或任何其他类型的跨度)在一个循环中,每次申报一个新ForegroundColorSpan。



Answer 8:

我们也可以使用SpannableStringBuilder与TextAppearanceSpan来实现这一目标。 按照下面的步骤来实现这样的。

  1. 创建一个风格styles.xml

 <style name="BoldStyle"> <!-- Can add other styling attributes --> <item name="android:textStyle">bold</item> ...... </style> 

  1. 使用下面的代码。
SpannableStringBuilder builder = new SpannableStringBuilder("First Part Not Bold BOLD rest not bold");
builder.setSpan(new TextAppearanceSpan(this, R.style.BoldStyle), 20, 24, 0);
((TextView)findViewById(R.id.tv7)).setText(builder);

而已。 希望它会帮助别人。



Answer 9:

为什么要使用SpannableStringBuilder时可以使用SpannableBuilder? ( https://gist.github.com/qtyq/90f9b4894069a8b3676c )

SpannableString ss = SpannableBuilder.init("First Part Not Bold BOLD rest not bold")
                                     .makeBold("BOLD")
                                     .create()


文章来源: SpannableStringBuilder to create String with multiple fonts/text sizes etc Example?