web-dev-qa-db-fra.com

Appliquer deux styles de police différents à une TextView

Je souhaite appliquer deux styles de police différents à un texte dans une seule TextView.

Mon cas est le même que Android - deux phrases, deux styles, un TextView . La seule différence est que je veux définir une police personnalisée sur tout le texte. J'ai inclus la police Helvetica en tant qu'actif dans mon projet et je souhaite appliquer cette police au TextView avec la première partie du texte sera Helvetica BOLD et la partie restante Helvetica NORMAL. Des suggestions sur la façon de procéder?

Texte nécessaire dans le format suivant. Texte personnalisé avec différents styles et affichage de texte unique.

enter image description here

28
rizzz86

Une façon de procéder consiste à étendre TypefaceSpan :

import Android.graphics.Paint;
import Android.graphics.Typeface;
import Android.text.TextPaint;
import Android.text.style.TypefaceSpan;

    public class CustomTypefaceSpan extends TypefaceSpan {
        private final Typeface newType;

        public CustomTypefaceSpan(String family, Typeface type) {
            super(family);
            newType = type;
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            applyCustomTypeFace(ds, newType);
        }

        @Override
        public void updateMeasureState(TextPaint Paint) {
            applyCustomTypeFace(Paint, newType);
        }

        private static void applyCustomTypeFace(Paint paint, Typeface tf) {
            int oldStyle;
            Typeface old = Paint.getTypeface();
            if (old == null) {
                oldStyle = 0;
            } else {
                oldStyle = old.getStyle();
            }

            int fake = oldStyle & ~tf.getStyle();
            if ((fake & Typeface.BOLD) != 0) {
                Paint.setFakeBoldText(true);
            }

            if ((fake & Typeface.ITALIC) != 0) {
                Paint.setTextSkewX(-0.25f);
            }

            Paint.setTypeface(tf);
        }
    }

Ensuite, lorsque vous souhaitez utiliser deux polices de caractères différentes, appelez:

String firstWord = "first ";
String secondWord = "second";

// Create a new spannable with the two strings
Spannable spannable = new SpannableString(firstWord+secondWord);

// Set the custom typeface to span over a section of the spannable object
spannable.setSpan( new CustomTypefaceSpan("sans-serif",CUSTOM_TYPEFACE), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan( new CustomTypefaceSpan("sans-serif",SECOND_CUSTOM_TYPEFACE), firstWord.length(), firstWord.length() + secondWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Set the text of a textView with the spannable object
textView.setText( spannable );
74
Ljdawson

Voici une solution plus simple, vous pouvez utiliser HTML pour définir différents styles sur le même TextView.

Par exemple:

// Styled label
String styledText = "<big><b><font color='#333333'>title</font></b></big> <small><b><font color='#CC5490'>subtitle</font></b></small>";

// Apply the styled label on the TextView
textView.setText(Html.fromHtml(styledText));

Vous avez besoin de l'importation suivante:

import Android.text.Html;
3
Yoann Hercouet

Cela peut fonctionner - créez votre propre TextView personnalisé, puis utilisez un StyleSpan sur une partie de celui-ci:

public class CustomTextView extends TextView {

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setTypeface(Typeface tf, int style) {
        if (style == 1){
            //replace "HelveticaBOLD.otf" with the name of your bold font
            tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaBOLD.otf");
        }else{
            //replace "HelveticaNORMAL.otf" with the name of your normal font
            tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaNORMAL.otf");
        }
        super.setTypeface(tf, 0);
    }
}

Et puis vous pouvez faire quelque chose comme:

int index1 = 0; //wherever bold should begin
int index2 = 5; //wherever bold should end

Spannable span = new SpannableString("some string");
span.setSpan(new StyleSpan(Typeface.BOLD),index1, index2,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

((CustomTextView)findViewById(R.id.yourTextView)).setText(span);
2
Sam Dozor

Vous pouvez créer une vue personnalisée et rendre votre texte avec deux objets Paint en utilisant la méthode canvas.drawText

0
Mina Samy

TypefaceSpan - Par exemple, considérons une TextView avec Android: textStyle = "italic" et une police de caractères créée à partir d'une police à partir de ressources, avec un style gras. Lorsque vous appliquez un TypefaceSpan basé sur la police de caractères, le texte conserve uniquement le style gras, remplaçant le TextStyle de TextView. Lors de l'application d'un TypefaceSpan basé sur une famille de polices: "monospace", le texte résultant conservera le style italique.

https://developer.Android.com/reference/Android/text/style/TypefaceSpan ?

0
Solanki Kamlesh