Вопрос по android, android-listview – Как сделать часть текста жирным шрифтом в Android во время выполнения?

67

ListView в моем приложении есть много строковых элементов, таких какname, experience, date of joiningи т.д. я просто хочу сделатьname смелый. Все строковые элементы будут в одномTextView.

мой XML:

<ImageView
    android:id="@+id/logo"
    android:layout_width="55dp"
    android:layout_height="55dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="15dp" >
</ImageView>

<TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/logo"
    android:padding="5dp"
    android:textSize="12dp" >
</TextView>

Мой код для установки TextView элемента ListView:

holder.text.setText(name + "\n" + expirience + " " + dateOfJoininf);

Ваш Ответ

5   ответов
185

TextView называетсяetx, Затем вы должны использовать следующий код:

final SpannableStringBuilder sb = new SpannableStringBuilder("HELLOO");

final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Span to make text bold
final StyleSpan iss = new StyleSpan(android.graphics.Typeface.ITALIC); //Span to make text italic
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold 
sb.setSpan(iss, 4, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make last 2 characters Italic

etx.setText(sb);
это будет работать с пользовательскими шрифтами?
@Siavash - работает с пользовательскими шрифтами.
Для Xamarin используйте как этоvar bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold);
да, это сработало .. спасибо Housefly
-1

<string name="mystring"><![CDATA[ <b>Hello</b> <i>World</i> ]]></string>

Затем в файле Java:

TextView myTextView = (TextView) this.findViewById(R.id.myTextView);
myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));
7

представленные здесь, являются правильными, но их нельзя вызывать в цикле, потому чтоStyleSpan Объект представляет собой один непрерывный промежуток (не стиль, который может быть применен к нескольким промежуткам). призваниеsetSpan несколько раз с одинаковым жирным шрифтомStyleSpan создастone bold span и просто переместить его в родительском диапазоне.

В моем случае (отображение результатов поиска) мне нужно, чтобы все экземпляры всех ключевых слов были выделены жирным шрифтом. Вот что я сделал:

private static SpannableStringBuilder emboldenKeywords(final String text,
                                                       final String[] searchKeywords) {
    // searching in the lower case text to make sure we catch all cases
    final String loweredMasterText = text.toLowerCase(Locale.ENGLISH);
    final SpannableStringBuilder span = new SpannableStringBuilder(text);

    // for each keyword
    for (final String keyword : searchKeywords) {
        // lower the keyword to catch both lower and upper case chars
        final String loweredKeyword = keyword.toLowerCase(Locale.ENGLISH);

        // start at the beginning of the master text
        int offset = 0;
        int start;
        final int len = keyword.length(); // let's calculate this outside the 'while'

        while ((start = loweredMasterText.indexOf(loweredKeyword, offset)) >= 0) {
            // make it bold
            span.setSpan(new StyleSpan(Typeface.BOLD), start, start+len, SPAN_INCLUSIVE_INCLUSIVE);
            // move your offset pointer 
            offset = start + len;
        }
    }

    // put it in your TextView and smoke it!
    return span;
}

Имейте в виду, что приведенный выше код недостаточно умен, чтобы пропустить двойное выделение, если одно ключевое слово является подстрокой другого. Например, если вы ищете"Fish fi" внутри"Fishes in the fisty Sea" это сделает"fish" смелые один раз, а затем"fi" часть. Хорошо, что, хотя это неэффективно и немного нежелательно, оно не будет иметь визуального недостатка, так как отображаемый результат все равно будет выглядеть

Fishэс вfiхлев Море

На данный момент это лучший вариант, который является общим и применимым во всех случаях.
17

вот вам общий, многократно используемый метод, если вам нужно применитьStyleSpanс несколькихTextViews, с поддержкой нескольких языков (где индексы являются переменными):

void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style) {
    SpannableStringBuilder sb = new SpannableStringBuilder(text);
    int start = text.indexOf(spanText);
    int end = start + spanText.length();
    sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    textView.setText(sb);
}

Используйте это вActivity вот так:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    StyleSpan boldStyle = new StyleSpan(Typeface.BOLD);
    setTextWithSpan((TextView) findViewById(R.id.welcome_text),
        getString(R.string.welcome_text),
        getString(R.string.welcome_text_bold),
        boldStyle);

    // ...
}

strings.xml

<string name="welcome_text">Welcome to CompanyName</string>
<string name="welcome_text_bold">CompanyName</string>

Результат:

Добро пожаловать вCompanyName

Этот блестящий !!!
1

который хотите выделить жирным шрифтом, или даже не знаете длину текста, который будет выделен жирным шрифтом, вы можете легко использовать HTML-теги, как показано ниже:

yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));

Похожие вопросы