90 votes

TextView avec une taille de texte différente

Est-il possible de définir différentes tailles de texte dans un TextView ? Je sais que je peux changer le style du texte en utilisant :

TextView textView = (TextView) findViewById(R.id.textView);
Spannable span = new SpannableString(textView.getText());
span.setSpan(arg0, 1, 10, arg3);
textView.setText(span)

Je connais l'intervalle début...fin du texte dont je veux changer la taille. Mais qu'est-ce que je peux utiliser comme arg0 y arg3 ?

201voto

Michele Points 3309

Essayez

span.setSpan(new RelativeSizeSpan(0.8f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

24voto

John Points 540

Je sais qu'il est très tard pour répondre, mais les gens peuvent toujours se poser la même question. sur ce sujet. Supposons que vous ayez ces deux chaînes dans votre fichier strings.xml

 <string name="my_text">You will need a to complete this assembly</string>
 <string name="text_sub1">screwdriver, hammer, and measuring tape</string>

Vous devez maintenant définir deux styles pour eux dans votre style.xml avec des tailles de texte différentes.

<style name="style0">
    <item name="android:textSize">19sp</item>
    <item name="android:textColor">@color/standout_text</item>
    <item name="android:textStyle">bold</item>
</style>
<style name="style1">
    <item name="android:textSize">23sp</item>
    <item name="android:textColor">@color/standout_light_text</item>
    <item name="android:textStyle">italic</item>
</style>

Maintenant, à partir de votre fichier Java, vous devez utiliser le spannable pour charger ces deux styles et chaînes de caractères sur le textView unique.

SpannableString formattedSpan = formatStyles(getString(R.string.my_text), getString(R.string.text_sub0), R.style.style0, getString(R.string.main_text_sub1), R.style.style1);
textView.setText(formattedSpan, TextView.BufferType.SPANNABLE);

Voici la méthode formatStyles qui renverra la chaîne formatée après l'application du style

private SpannableString formatStyles(String value, String sub0, int style0, String sub1, int style1)
{ 
    String tag0 = "{0}";
    int startLocation0 = value.indexOf(tag0);
    value = value.replace(tag0, sub0);

    String tag1 = "{1}";
    int startLocation1 = value.indexOf(tag1);
    if (sub1 != null && !sub1.equals(""))
    { 
        value = value.replace(tag1, sub1);
    } 
    SpannableString styledText = new SpannableString(value);
    styledText.setSpan(new TextAppearanceSpan(getActivity(), style0), startLocation0, startLocation0 + sub0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    if (sub1 != null && !sub1.equals(""))
    { 
        styledText.setSpan(new TextAppearanceSpan(getActivity(), style1), startLocation1, startLocation1 + sub1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    } 

    return styledText;
}

14voto

Simone Dagli Orti Points 431

Essayez avec AbsoluteSizeSpan

snackbarText.setSpan(new AbsoluteSizeSpan(fontsize, true), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Le code complet est :

SpannableStringBuilder snackbarText = new SpannableStringBuilder();
snackbarText.append("Your text");
snackbarText.setSpan(new AbsoluteSizeSpan(fontsize, true), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Snackbar.make(getCurrentFocus(), snackbarText, Snackbar.LENGTH_LONG).setAction("Action", null).show();`

1voto

Arkde Points 1820

Vous pouvez toujours utiliser la classe Html pour analyser une chaîne avec des styles html de format différent : Vous pouvez essayer quelque chose comme :

 textView.setText(Html.fromHtml("<font size=\"5\" face=\"arial\" color=\"red\">"+
  "This paragraph is in Arial, size 5, and in red text color." + "</font>" + ...));

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