Taille de police différente des chaînes dans le même TextView

141

J'ai un textViewintérieur avec un nombre (variable) et un string, comment puis-je donner au numéro une taille plus grande que le string? le code:

TextView size = (TextView)convertView.findViewById(R.id.privarea_list_size);
if (ls.numProducts != null) {
    size.setText(ls.numProducts + " " + mContext.getString(R.string.products));
}

Je veux que ls.numproducts ait une taille différente du reste du texte. Comment faire?

Adriana Carelli
la source

Réponses:

360

Utiliser un Spannable String

 String s= "Hello Everyone";
 SpannableString ss1=  new SpannableString(s);
 ss1.setSpan(new RelativeSizeSpan(2f), 0,5, 0); // set size
 ss1.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);// set color
 TextView tv= (TextView) findViewById(R.id.textview);
 tv.setText(ss1); 

Instantané

entrez la description de l'image ici

Vous pouvez diviser la chaîne en utilisant un espace et ajouter une étendue à la chaîne dont vous avez besoin.

 String s= "Hello Everyone";  
 String[] each = s.split(" ");

Maintenant, appliquez spanà stringet ajoutez la même chose à textview.

Raghunandan
la source
setSpan () return: java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) se termine au-delà de la longueur 1. Qu'est-ce que cela signifie?
Adriana Carelli
vérifiez la longueur de la chaîne. IndexOutOfBoundsException: indication d'une position d'index incorrecte pour le début et la fin de la plage. dans la longueur de Hello ci-dessus est de 5, j'ai donc appliqué une plage d'index 0 à 5
Raghunandan
A parfaitement fonctionné sur Google Glass!
Mohammad Arman
2
existe-t-il un moyen de déplacer les caractères petits vers le centre dans le sens vertical? Fondamentalement, tous les caractères doivent être centrés verticalement, quelle que soit leur taille.
500865
Vous avez probablement besoin de deux vues de texte dans ce cas ou bien vous devez créer votre propre vue de texte
Raghunandan
119

Juste au cas où vous vous demandez comment définir plusieurs tailles différentes dans la même vue de texte, mais en utilisant une taille absolue et non relative, vous pouvez y parvenir en utilisant AbsoluteSizeSpanau lieu d'un RelativeSizeSpan.

Obtenez simplement la dimension en pixels de la taille de texte souhaitée

int textSize1 = getResources().getDimensionPixelSize(R.dimen.text_size_1);
int textSize2 = getResources().getDimensionPixelSize(R.dimen.text_size_2);

puis créez un nouveau AbsoluteSpanbasé sur le texte

String text1 = "Hi";
String text2 = "there";

SpannableString span1 = new SpannableString(text1);
span1.setSpan(new AbsoluteSizeSpan(textSize1), 0, text1.length(), SPAN_INCLUSIVE_INCLUSIVE);

SpannableString span2 = new SpannableString(text2);
span2.setSpan(new AbsoluteSizeSpan(textSize2), 0, text2.length(), SPAN_INCLUSIVE_INCLUSIVE);

// let's put both spans together with a separator and all
CharSequence finalText = TextUtils.concat(span1, " ", span2);
Joao Sousa
la source
Bon ajout avec AbsoluteSizeSpanexemple
eugeneek
@AmitGarg souhaitez-vous élaborer?
Joao Sousa du
4
Vous pouvez également utiliser AbsoluteSizeSpan(sizeInDip, true)pour spécifier la taille directement dans dp
Ilia Grabko
8

Vous pouvez le faire en utilisant une chaîne html et en définissant le html sur Textview en utilisant
txtView.setText(Html.fromHtml("Your html string here"));

Par exemple :

txtView.setText(Html.fromHtml("<html><body><font size=5 color=red>Hello </font> World </body><html>"));`
Remmyabhavan
la source
1
Belle contribution! Mais fromHtml à partir de maintenant (API> = N) est obsolète. Pour que cela fonctionne, procédez comme suit
statosdotcom
Quelle est l'unité de "5"? Est-ce dp? Est-ce sp? Comment puis-je le remplacer par l'un de ceux-ci?
développeur android
les couleurs et la famille fonctionnent cependant, la taille ne fonctionne pas.
c-an
5

Méthode 1

public static void increaseFontSizeForPath(Spannable spannable, String path, float increaseTime) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new RelativeSizeSpan(increaseTime), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

en utilisant

Utils.increaseFontSizeForPath(spannable, "big", 3); // make "big" text bigger 3 time than normal text

entrez la description de l'image ici

Méthode 2

public static void setFontSizeForPath(Spannable spannable, String path, int fontSizeInPixel) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new AbsoluteSizeSpan(fontSizeInPixel), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

en utilisant

Utils.setFontSizeForPath(spannable, "big", (int) textView.getTextSize() + 20); // make "big" text bigger 20px than normal text

entrez la description de l'image ici

Phan Van Linh
la source
3
private SpannableStringBuilder SpannableStringBuilder(final String text, final char afterChar, final float reduceBy) {
        RelativeSizeSpan smallSizeText = new RelativeSizeSpan(reduceBy);
        SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text);
        ssBuilder.setSpan(
                smallSizeText,
                text.indexOf(afterChar),
                text.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        );

        return ssBuilder;
    }
------------------------
TextView textView =view.findViewById(R.id.textview);
String s= "123456.24";
textView.setText(SpannableStringBuilder(s, '.', 0.7f));

---------------- Résultat ---------------

Résultat :

12345. 24

Anandharaj R
la source
2

La meilleure façon de le faire est Html sans sous-chaîne de votre texte et entièrement dynamique Par exemple:

  public static String getTextSize(String text,int size) {
         return "<span style=\"size:"+size+"\" >"+text+"</span>";

    }

et vous pouvez utiliser l'attribut couleur etc ... si d'autre part:

size.setText(Html.fromHtml(getTextSize(ls.numProducts,100) + " " + mContext.getString(R.string.products));  
Garci
la source
1

J'ai écrit ma propre fonction qui prend 2 chaînes et 1 int (taille du texte)

Le texte intégral et la partie du texte dont vous souhaitez modifier la taille.

Il renvoie un SpannableStringBuilder que vous pouvez utiliser en vue texte.

  public static SpannableStringBuilder setSectionOfTextSize(String text, String textToChangeSize, int size){

        SpannableStringBuilder builder=new SpannableStringBuilder();

        if(textToChangeSize.length() > 0 && !textToChangeSize.trim().equals("")){

            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textToChangeSize.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();
            //for counting start/end indexes

            if(startingIndex < 0 || endingIndex <0){
                return builder.append(text);
            }
            else if(startingIndex >= 0 && endingIndex >=0){

                builder.append(text);
                builder.setSpan(new AbsoluteSizeSpan(size, true), startingIndex, endingIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }else{
            return builder.append(text);
        }

        return builder;
    }
Ali Asadi
la source
0

Au cas où vous voudriez éviter trop de confusion pour vos traducteurs, j'ai trouvé un moyen d'avoir juste un espace réservé dans les chaînes, qui sera géré dans le code.

Donc, supposé que vous ayez ceci dans les chaînes:

    <string name="test">
        <![CDATA[
        We found %1$s items]]>
    </string>

Et vous voulez que le texte de l'espace réservé ait une taille et une couleur différentes, vous pouvez utiliser ceci:

        val textToPutAsPlaceHolder = "123"
        val formattedStr = getString(R.string.test, "$textToPutAsPlaceHolder<bc/>")
        val placeHolderTextSize = resources.getDimensionPixelSize(R.dimen.some_text_size)
        val placeHolderTextColor = ContextCompat.getColor(this, R.color.design_default_color_primary_dark)
        val textToShow = HtmlCompat.fromHtml(formattedStr, HtmlCompat.FROM_HTML_MODE_LEGACY, null, object : Html.TagHandler {
            var start = 0
            override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {
                when (tag) {
                    "bc" -> if (!opening) start = output.length - textToPutAsPlaceHolder.length
                    "html" -> if (!opening) {
                        output.setSpan(AbsoluteSizeSpan(placeHolderTextSize), start, start + textToPutAsPlaceHolder.length, 0)
                        output.setSpan(ForegroundColorSpan(placeHolderTextColor), start, start + textToPutAsPlaceHolder.length, 0)
                    }
                }
            }
        })
        textView.text = textToShow

Et le résultat:

entrez la description de l'image ici

développeur android
la source