Come rendere parte del testo in grassetto in Android in fase di esecuzione?


97

Un ListViewnella mia applicazione ha molti elementi di stringa come name, experience, date of joining, ecc voglio solo fare namein grassetto. Tutti gli elementi della stringa saranno in un unico fileTextView .

il mio 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>

Il mio codice per impostare il TextView dell'elemento ListView:

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

Risposte:


229

Di 'che hai una TextViewchiamata etx. Dovresti quindi utilizzare il codice seguente:

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


2
Per Xamarin, usa in questo modovar bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold);
Elisabeth

Per Xamarin,etx.TextFormatted = sb;
Darius

27

Sulla base della risposta di Imran Rana, ecco un metodo generico e riutilizzabile se è necessario applicare StyleSpans a più TextViews, con supporto per più lingue (dove gli indici sono variabili):

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

Usalo in questo Activitymodo:

@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>

Risultato:

Benvenuto in CompanyName


12

Le risposte fornite qui sono corrette, ma non possono essere chiamate in un ciclo perché l' StyleSpanoggetto è un singolo intervallo contiguo (non uno stile che può essere applicato a più intervalli). Chiamare setSpanpiù volte con lo stesso grassetto StyleSpancreerebbe un intervallo in grassetto e lo sposterebbe semplicemente nell'arco genitore.

Nel mio caso (visualizzazione dei risultati di ricerca), avevo bisogno di far apparire in grassetto tutte le istanze di tutte le parole chiave di ricerca. Questo è quello che ho fatto:

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

Tieni presente che il codice sopra non è abbastanza intelligente da saltare il doppio grassetto se una parola chiave è una sottostringa dell'altra. Ad esempio, se cerchi "Fish fi" all'interno di "Fishes in the fisty Sea" renderà il "pesce" in grassetto una volta e poi "fi" . La cosa buona è che sebbene inefficiente e un po 'indesiderabile, non avrà uno svantaggio visivo poiché il risultato visualizzato sarà comunque

Pesce es nel fi Mar porcile


hey amico puoi per favore vedere questo stackoverflow.com/questions/59947482/…
Pemba Tamang

6

Puoi farlo usando Kotlin e la buildSpannedStringfunzione di estensione dacore-ktx

 holder.textView.text = buildSpannedString {
        bold { append("$name\n") }
        append("$experience $dateOfJoining")
 }

5

se non conosci esattamente la lunghezza del testo prima della porzione di testo che vuoi rendere Grassetto, o anche se non sai che la lunghezza del testo è Grassetto, puoi facilmente usare tag HTML come i seguenti:

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

0

Estendere la risposta di Frieder per supportare l'insensibilità di casi e segni diacritici.

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

0

Se stai usando l'annotazione @ srings / your_string, accedi al file strings.xml e usa il <b></b> tag nella parte di testo che desideri.

Esempio:

    <string><b>Bold Text</b><i>italic</i>Normal Text</string>

-1

Consiglio di utilizzare il file strings.xml con CDATA

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

Quindi nel file java:

TextView myTextView = (TextView) this.findViewById(R.id.myTextView);
myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.