我需要创建一个放置在TextView中的字符串,该字符串将显示如下字符串:
第一部分不加粗 大胆的 休息不加粗
所以我想知道我SpannableStringBuilder该如何使用呢?
我可以使用三个TextEdit来完成此操作,但我想使用最佳解决方案。
我需要创建一个放置在TextView中的字符串,该字符串将显示如下字符串:
第一部分不加粗 大胆的 休息不加粗
所以我想知道我SpannableStringBuilder该如何使用呢?
我可以使用三个TextEdit来完成此操作,但我想使用最佳解决方案。
Answers:
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);
    end的前start一个IndexOutOfBoundsException。因此,最好格式化子字符串,然后将它们放在一起。
                    android:textAllCaps="true"将打破SpannableString
                    接受的答案很好(我赞成),但是它无法按照提交者的要求使用SpannableStringBuilder。正如我曾经想到过的那样,Builder最有意义,这是该代码(如果对其他人有帮助的话,还可以使用更改文本颜色的额外使用)。请注意,您还可以向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");
    如果您使用的是Kotlin,则可以使用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:1.2.0"
}
    从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;
}
    使用以下Html类在TextView中使用HTML代码:
Spanned styledText = Html.fromHtml("First Part Not Bold <b>BOLD</b> rest not bold");
textView.setText(styledText);
    此代码应将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样式标签,例如Superscript(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;
        }
要设置颜色,只需将ForegroundColorSpan与setSpan一起使用。
sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
希望能帮助到你。
所以我知道这已经解决了,甚至可以通过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查询的Cursor类型构造的ContentValues类型。我唯一遇到的问题是一开始只有ColorSpaning第一部分。它暗示您每次要在循环中使用一个(或任何其他种类的跨度)时都需要声明一个新的ForegroundColorSpan。
我们还可以将SpannableStringBuilder与TextAppearanceSpan结合使用来实现。请按照以下步骤实施。
styles.xml。<style name="BoldStyle">
   <!-- Can add other styling attributes -->
   <item name="android:textStyle">bold</item>
   ......
</style>
SpannableStringBuilder builder = new SpannableStringBuilder(“第一部分不加粗,其余部分不加粗”); builder.setSpan(new TextAppearanceSpan(this,R.style.BoldStyle),20,24,0); ((TextView)findViewById(R.id.tv7))。setText(builder);
而已。希望对别人有帮助。
当可以使用SpannableBuilder时,为什么还要使用SpannableStringBuilder?(https://gist.github.com/qtyq/90f9b4894069a8b3676c)
SpannableString ss = SpannableBuilder.init("First Part Not Bold BOLD rest not bold")
                                     .makeBold("BOLD")
                                     .create()