91 votes

SpannableStringBuilder pour créer une chaîne de caractères avec plusieurs polices/tailles de texte etc Exemple ?

J'ai besoin de créer une chaîne placée dans un TextView qui affichera une chaîne comme ceci :

La première partie n'est pas en gras GRAS repos non gras

Donc je veux savoir comment je pourrais utiliser SpannableStringBuilder pour faire ça ?

Je pourrais utiliser trois TextEdit pour y parvenir, mais j'aimerais utiliser la meilleure solution.

104voto

hotveryspicy Points 21181
First Part Not Bold   BOLD  rest not bold

Vous pouvez le faire comme @Rajesh l'a suggéré ou par ceci.

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

pour montrer ceci dans le TextView

textview.setText(sb,  TextView.BufferType.SPANNABLE);

93voto

Josh Points 326

La réponse acceptée est très bien (et je l'ai votée), mais elle n'utilise pas le SpannableStringBuilder comme l'a demandé l'auteur de la réponse. Comme j'ai eu un cas où le Builder était le plus utile, voici le code pour cela (avec en prime la possibilité de changer la couleur du texte si cela peut aider d'autres personnes). Notez que vous pourriez également fournir la chaîne initiale au constructeur de SpannableStringBuilder, mais je l'ai réglé ici pour utiliser "append" pour être clair que vous pouvez ajouter beaucoup avant votre texte "gras" désiré et ensuite juste enregistrer le début comme indiqué. Je soupçonne que ce code est également plus rapide que la réponse acceptée.

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

88voto

David Rawson Points 11480

Si vous utilisez Kotlin, vous pouvez faire ce qui suit en utilisant la fonction Android-ktx bibliothèque

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

En bold est une fonction d'extension sur SpannableStringBuilder . Vous pouvez consulter la documentation aquí pour obtenir une liste des opérations que vous pouvez utiliser.

Un autre exemple :

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 est une couleur RVB résolue.

Il est même possible d'imbriquer des travées pour obtenir un DSL intégré :

bold { underline { italic { append("Bold and underlined") } } }

Vous aurez besoin des éléments suivants au niveau du module de votre application build.gradle pour qu'il fonctionne :

repositories {
    google()
}

dependencies {
    implementation "androidx.core:core-ktx:1.2.0"
}

43voto

Gober Points 2275

L'API 21 de SpannableStringBuilder comprend une méthode simple pour ce faire. Voici un exemple de solution :

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

Comme il est fort probable que vous ne preniez pas en charge l'API 21, vous pouvez uniquement reproduire le code de cette méthode :

public SpannableStringBuilder append(CharSequence text, Object what, int flags) {
        int start = length();
        append(text);
        setSpan(what, start, length(), flags);
        return this;
}

7voto

Rajesh Points 9153

Utiliser le code HTML dans le TextView en utilisant la fonction Html classe :

Spanned styledText = Html.fromHtml("First Part Not Bold <b>BOLD</b> rest not bold");
textView.setText(styledText);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X