web-dev-qa-db-fra.com

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

J'ai une textView à l'intérieur avec un nombre (variable) et une string, comment puis-je donner au numéro une taille supérieure à la 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?

114
Adriana Carelli

Utilisez 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é

enter image description here

Vous pouvez diviser une chaîne en utilisant un espace et ajouter une étendue à la chaîne souhaitée.

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

Maintenant, appliquez span à la string et ajoutez le même à textview.

297
Raghunandan

Juste au cas où vous vous demandez comment définir plusieurs tailles différentes dans la même vue texte, mais en utilisant une taille absolue et non relative, vous pouvez y parvenir en utilisant AbsoluteSizeSpan au lieu de 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 une nouvelle AbsoluteSpan basée 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);
97
Joao Sousa

Vous pouvez le faire en utilisant une chaîne html et en définissant 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>"));`
9
Remmyabhavan

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

 enter image description here

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

 enter image description here

2
Linh
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

1
Anandharaj R

La meilleure façon de le faire est le 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 attribut de couleur, etc ... si l’autre main:

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

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 retourne un SpannableStringBuilder que vous pouvez utiliser en mode 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;
    }
1
Ali Asadi

Essayez spannableStringbuilder . En utilisant cela, nous pouvons créer une chaîne avec plusieurs tailles de police.

1
PgmFreek