web-dev-qa-db-fra.com

Comment changer la police du tiroir de navigation?

Je veux utiliser ma propre police pour le tiroir de navigation dans Android.J'utilise la bibliothèque fournie avec Android studio selon cette réponse: https://stackoverflow.com/a/23632492/4393226 . Mais je ne sais pas comment changer la police et en faire RTL. J'ai beaucoup cherché et j'ai trouvé comment faire le tiroir RTL. J'utilise ce code:

getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

et Android - Le tiroir de navigation du côté droit est-il possible?

Mais comme vous le savez, cela ne fonctionne que dans l'API 17 et au-dessus. Aidez-moi! Comment changer la police du menu? Comment faire la mise en page RTL de la bonne manière?!

Modifié : Mon fichier de police "TTF" est dans les actifs/polices et je sais comment le définir pour une visualisation de texte en utilisant Java, mais je ne sais pas comment le configurer dans le menu du tiroir de navigation.

14
Amir H

J'ai trouvé la réponse: Créez d'abord cette classe dans votre projet:

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

Ajoutez ensuite cette méthode à votre activité pour laquelle vous souhaitez modifier la police du menu du tiroir de navigation:

private void applyFontToMenuItem(MenuItem mi) {
        Typeface font = Typeface.createFromAsset(getAssets(), "ds_digi_b.TTF");
        SpannableString mNewTitle = new SpannableString(mi.getTitle());
        mNewTitle.setSpan(new CustomTypefaceSpan("" , font), 0 , mNewTitle.length(),  Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        mi.setTitle(mNewTitle);
}

puis ajoutez appelez la méthode que vous venez d'ajouter dans votre activité:

navView = (NavigationView) findViewById(R.id.navView);
Menu m = navView.getMenu();
for (int i=0;i<m.size();i++) {
    MenuItem mi = m.getItem(i);

    //for aapplying a font to subMenu ...
    SubMenu subMenu = mi.getSubMenu();
    if (subMenu!=null && subMenu.size() >0 ) {
        for (int j=0; j <subMenu.size();j++) {
            MenuItem subMenuItem = subMenu.getItem(j);
            applyFontToMenuItem(subMenuItem);
        }
    }

    //the method we have create in activity
    applyFontToMenuItem(mi);
}
36
Amir H

Vous pouvez le faire de manière plus simple.

Allez d'abord dans style.xml et créez-y un nouveau style.

 <style name="RobotoTextViewStyle" parent="Android:Widget.TextView">
      <item name="Android:fontFamily">@font/sans-serif-smallcaps</item>
 </style>

et la seconde est d'aller à votre code de navigation xml et mettre l'apparence du texte de l'élément là.

app:itemTextAppearance="@style/RobotoTextViewStyle"

maintenant votre code de navigation final devrait être celui-ci.

<Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        app:itemTextAppearance="@style/RobotoTextViewStyle"
        Android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_home"
        app:menu="@menu/activity_home_drawer" />
19
Shrawan

Étape 1: créez le style comme suit dans style.xml

<style name="NavigationView" >
<item name="fontFamily">@font/helvetica_neue_light</item>
</style>

Étape 2: Ajoutez un style en tant que thème dans votre Android.support.design.widget.NavigationView

Android: theme = "@ style/NavigationView"

10

Ajout à la réponse de Rischan.

J'ai édité "mi" directement car ce sont les titres de menu de mon tiroir. J'ai ensuite modifié le paramètre s.setSpan 1st pour utiliser une classe personnalisée CustomTypefaceSpan.

    // Navigation View
    NavigationView navigationView = (NavigationView) 
    findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    Menu m = navigationView .getMenu();

    Typeface tf1 = Typeface.createFromAsset(getAssets(), "font/Gotham Narrow Extra Light.otf");

    for (int i=0;i<m.size();i++) {

        MenuItem mi = m.getItem(i);

        SpannableString s = new SpannableString(mi.getTitle());
        s.setSpan(new CustomTypefaceSpan("", tf1), 0, s.length(),
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        mi.setTitle(s);

    }

Classe CustomTypefaceSpan:

package my.app;
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);
    }
}

Je ne peux pas croire à quel point il est compliqué de changer les polices du menu.

9
williamsi

Je vous remercie! J'ai réussi à changer la police dans le tiroir de navigation en fonction du message @Amir H ​​mais avec la configuration (ajoutez simplement plusieurs lignes à votre activité)

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        Menu m = navigationView .getMenu();

        for (int i=0;i<m.size();i++) {
            MenuItem mi = m.getItem(i);

            //for applying a font to subMenu ...
            SubMenu subMenu = mi.getSubMenu();
            if (subMenu!=null && subMenu.size() >0 ) {
                for (int j=0; j <subMenu.size();j++) {
                    MenuItem subMenuItem = subMenu.getItem(j);
                    SpannableString s = new SpannableString(subMenuItem.getTitle());
                    s.setSpan(new TypefaceSpan("fonts/yourfontname.ttf"), 0, s.length(),
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    subMenuItem.setTitle(s);
                }
            }

        }

Peut-être que cela aidera quelqu'un :)

5
rischan

Cela fonctionne uniquement pour les polices

  1. Tout d'abord, ajoutez la couleur de votre police (si vous souhaitez la modifier) ​​dans colors.xml fichier situé à res->values->colors.xml comme

    <color name="black">#000000</color> // it's for black don't go for white color
    
  2. Modifiez ensuite style.xml fichier situé dans le même répertoire de valeurs (il y a deux fichiers qui modifient ce fichier qui a votre thème avec le style name="your_theme" ou trouver une ligne dans ces deux fichiers

  3. Ici, nous devons définir la propriété de la police. Vous devez donc créer une nouvelle balise de style en enfermant les balises de ressource. dans mon cas je crée

    <style name="MyText" parent="@Android:style/TextAppearance.Medium">
        <item name="Android:textSize">20sp</item> //size of font
        <item name="Android:textColor">@color/black</item> //color of font
        <item name="Android:typeface">sans</item> // type how it appear
    </style>
    

    Notez que le nom donné pour cette balise est MyText. Nous devons maintenant utiliser ce nom dans le premier bloc de style ci-dessus dont le nom est votre thème d'application.

  4. A mentionné ce nouveau style dans la balise de style de thème d'application ci-dessus. Dans mon cas, c'est comme

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="Android:textViewStyle">@style/MyText</item> //MyText its custom style for font
        </style>
    
2
Abhishek