SpannableStringBuilder для создания строки с несколькими шрифтами / размерами текста и т. д. Пример?



Мне нужно создать строку, помещенную в TextView, которая будет отображать строку следующим образом:




Первая Часть Не Жирный полужирный остальное не жирный




Итак, я хочу знать, как я мог бы использовать SpannableStringBuilder для этого?



Я мог бы использовать три TextEdit для достижения этой цели, но я хотел бы использовать лучшее решение.

554   9  

9 ответов:

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

принятый ответ в порядке (и я его поддержал), но он не может использовать 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");

из 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);

поэтому я знаю, что это было решено, и даже по запросу с 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-это тип ContentValues, который я построил из возвращенного типа Курсора SQL-запроса. Единственная проблема, с которой я столкнулся, заключалась в том, что сначала это был только цветовой охват первого сегмента. Это швы, что вам нужно объявить новый ForegroundColorSpan каждый раз, когда вы хотите используйте один (или любой другой период) в цикле.

этот код должен быть полужирным для всего, что входит в тег html bold. И он также удаляет тег, так что отображается только содержимое внутри.

        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 tag) и т. д.

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

надеюсь, что это помогает.

если вы используете Kotlin, вы можете сделать следующее С помощью android-ktx библиотека

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

The 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'
}

мы также можем использовать 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);

вот именно. Надеюсь, это кому-нибудь поможет.

почему вы используете SpannableStringBuilder, когда вы можете использовать SpannableBuilder?? (https://gist.github.com/qtyq/90f9b4894069a8b3676c)

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

Comments

    Ничего не найдено.