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.

6voto

40-Love Points 1333

Ce code devrait mettre en gras tout ce qui se trouve à l'intérieur de la balise html bold. Il supprime également la balise afin que seul le contenu soit affiché.

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

Ce code peut également être adapté pour d'autres balises de style html, telles que Superscript (balise sup), etc.

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

Pour définir la couleur, il suffit d'utiliser le ForegroundColorSpan avec setSpan.

sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

J'espère que cela vous aidera.

5voto

Mahendran Sakkarai Points 5702

Nous pouvons également utiliser SpannableStringBuilder con TextAppearanceSpan pour y parvenir. Suivez les étapes ci-dessous pour le faire.

  1. Créez un style dans styles.xml .

    <style name="BoldStyle"> <!-- Can add other styling attributes --> <item name="android:textStyle">bold</item> ...... </style>

  2. Utilisez le code ci-dessous.

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

C'est tout. J'espère que ça aidera quelqu'un.

4voto

Zeppie Points 179

Je sais que cela a été résolu, et même demandé avec SpannableStringBuilder, mais au cas où vous voudriez construire une chaîne de manière plus dynamique, je me suis dit que je mettrais ceci en place.

// 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 est un type ContentValues que j'ai construit à partir du type Cursor retourné de la requête SQL. Le seul problème que j'ai rencontré est qu'au début, l'analyse colorimétrique ne concernait que le premier segment. Il semble qu'il faille déclarer un nouveau ForegroundColorSpan chaque fois que l'on veut en utiliser un (ou tout autre type de span) dans une boucle.

2voto

Reza Zavareh Points 91

Vous pouvez mettre en gras et redimensionner une partie de votre chaîne en kotlin

val s = SpannableStringBuilder()
    .append("First Part Not Bold And No Resize ")
    .bold { scale(1.5f, { append("Second Part By Bold And Resize " )}) } 
    .append("Third Part Not Bold And No Resize")

yourTextview.text = s

1voto

qtyq Points 92

Pourquoi utiliser SpannableStringBuilder quand on peut utiliser SpannableBuilder ? ( https://gist.github.com/qtyq/90f9b4894069a8b3676c )

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

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