111

私のアプリケーションのAには、、、などのListView多くの文字列要素があります。太字にしたいだけです。すべての文字列要素は単一のになります。nameexperiencedate of joiningnameTextView

私の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>

ListViewアイテムのTextViewを設定するための私のコード:

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

9 に答える 9

257

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

于 2012-06-11T12:11:13.400 に答える
31

Imran Ranaの回答に基づいて、複数の言語(インデックスが可変)をサポートする複数のsにStyleSpansを適用する必要がある場合は、一般的で再利用可能な方法を次に示します。TextView

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へようこそ

于 2016-01-14T14:16:09.753 に答える
20

KotlinとbuildSpannedString拡張機能を使用してそれを行うことができますcore-ktx

 holder.textView.text = buildSpannedString {
        bold { append("$name\n") }
        append("$experience $dateOfJoining")
 }
于 2019-10-11T17:00:44.207 に答える
14

ここで提供される答えは正しいですが、StyleSpanオブジェクトが単一の連続したスパンであるため、ループで呼び出すことはできません(複数のスパンに適用できるスタイルではありません)。setSpan同じ太字で複数回呼び出すと、太字のスパンStyleSpanが1つ作成され、親スパン内で移動するだけです。

私の場合(検索結果の表示)、すべての検索キーワードのすべてのインスタンスを太字で表示する必要がありました。これは私がしたことです:

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

上記のコードは、一方のキーワードがもう一方のサブストリングである場合、二重太字をスキップするほど賢くないことに注意してください。たとえば、「Fisty in the fisty Sea」内で「Fishfi を検索すると、「fish」が太字になり、次に「fi」の部分が太字になります。良い点は、非効率的で少し望ましくありませんが、表示される結果は次のように表示されるため、視覚的な欠点はありません。

熾烈な海の

于 2016-11-04T00:43:30.357 に答える
6

太字にしたいテキスト部分の前のテキストの長さが正確にわからない場合、または太字にするテキストの長さがわからない場合でも、次のようなHTMLタグを簡単に使用できます。

yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));
于 2017-07-11T06:31:43.347 に答える
1

CDATAでstrings.xmlファイルを使用することをお勧めします

<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) ));
于 2014-03-07T00:20:59.087 に答える
1

ケースと発音区別符号の鈍感をサポートするために揚げ物の答えを拡張します。

public static String stripDiacritics(String s) {
        s = Normalizer.normalize(s, Normalizer.Form.NFD);
        s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
        return s;
}

public static void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style, boolean caseDiacriticsInsensitive) {
        SpannableStringBuilder sb = new SpannableStringBuilder(text);
        int start;
        if (caseDiacriticsInsensitive) {
            start = stripDiacritics(text).toLowerCase(Locale.US).indexOf(stripDiacritics(spanText).toLowerCase(Locale.US));
        } else {
            start = text.indexOf(spanText);
        }
        int end = start + spanText.length();
        if (start > -1)
            sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        textView.setText(sb);
    }
于 2017-01-10T11:56:09.157 に答える
1

@ srings / your_stringアノテーションを使用している場合は、strings.xmlファイルにアクセスし<b></b>、テキストの必要な部分でタグを使用します。

例:

    <string><b>Bold Text</b><i>italic</i>Normal Text</string>
于 2020-01-31T21:04:46.217 に答える
1
<string name="My_Name">Given name is <b>Not Right</b>Please try again </string>

string.xmlファイルで「b」タグを使用します。
斜体の「i」と下線の「u」も同様です。

于 2020-12-04T20:30:22.740 に答える