web-dev-qa-db-fra.com

Android - Comment changer la famille de polices du texte de la barre de navigation inférieure

J'ai créé une barre de navigation inférieure dans ma page Android. Mais maintenant, je veux appliquer la famille de polices personnalisée dans les textes de navigation inférieurs.

C'est le code de navigation inférieur dans le fichier .xml:

<Android.support.design.widget.BottomNavigationView
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:id="@+id/bottomNavView_Bar"
            Android:background="@drawable/white_grey_border_top"
            app:menu="@menu/bottom_navigation_menu">
</Android.support.design.widget.BottomNavigationView>

En outre, code dans bottom_navigation_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      >

    <item
        Android:id="@+id/ic_newsfeed"
        Android:icon="@drawable/ic_menu_camera"
        Android:title="NEWSFEED"
        />

        <item
            Android:id="@+id/ic_Explorer"
            Android:icon="@drawable/ic_home_black_24dp"
            Android:title="Explorer"
            />
        <item
            Android:id="@+id/ic_notify"
            Android:icon="@drawable/ic_notifications_black_24dp"
            Android:title="NOTIFY"
            />
        <item
            Android:id="@+id/ic_more"
            Android:icon="@drawable/ic_dashboard_black_24dp"
            Android:title="MORE"
            />

</menu>

L'aide serait appréciée.

Merci d'avance!

14
Neha Beniwal

ajoutez le fichier de police dans le dossier res/font/pour regrouper les polices en tant que ressources

puis

Vous pouvez le changer en utilisant des ressources de style . Dans votre styles.xml:

<style name="Widget.BottomNavigationView" parent="Widget.Design.BottomNavigationView">
<item name="fontFamily">@font/your_font</item>

Puis appliquez-le comme thème dans votre vue:

<Android.support.design.widget.BottomNavigationView
...
Android:theme="@style/Widget.BottomNavigationView" />

Je viens de vérifier mon application, cela fonctionne bien. 

référence: https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html#fonts-in-code

54
A. Kazarovets

Dans votre mise en page:

<com.google.Android.material.bottomnavigation.BottomNavigationView
    ...
    app:itemTextAppearanceActive="@style/BottomNavigationViewTextStyle"
    app:itemTextAppearanceInactive="@style/BottomNavigationViewTextStyle"
    ... />

Dans votre styles.xml: 

<style name="BottomNavigationViewTextStyle">
    ...
    <item name="Android:fontFamily">@font/whatever_font</item>
    ...
</style>
6
Janosch Pelzer

Cela peut être fait en surchargeant onLayout method of BottomNavigationView class puis en utilisant la balise étendue. Cette approche affiche également tous les titres de menu et désactive le décalage.

public final class ExtendedBottomNavigationView extends BottomNavigationView{
    private final Context context;
    private Typeface fontFace = null;

    public ExtendedBottomNavigationView(Context context, AttributeSet attrs){
        super(context, attrs);
        this.context = context;
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom){
        super.onLayout(changed, left, top, right, bottom);
        final ViewGroup bottomMenu = (ViewGroup)getChildAt(0);
        final int bottomMenuChildCount = bottomMenu.getChildCount();
        BottomNavigationItemView item;
        View itemTitle;
        Field shiftingMode;

        if(fontFace == null){
            fontFace = Typeface.createFromAsset(context.getAssets(), context.getString(R.string.VazirBold));
        }
        try {
            //if you want to disable shiftingMode:
            //shiftingMode is a private member variable so you have to get access to it like this:
            shiftingMode = bottomMenu.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(bottomMenu, false);
            shiftingMode.setAccessible(false);
        } catch (NoSuchFieldException e){
            e.printStackTrace();
        } catch (IllegalAccessException e){e.printStackTrace();}

        for(int i=0; i<bottomMenuChildCount; i++){
            item = (BottomNavigationItemView)bottomMenu.getChildAt(i);
            //this shows all titles of items
            item.setChecked(true);
            //every BottomNavigationItemView has two children, first is an itemIcon and second is an itemTitle
            itemTitle = item.getChildAt(1);
            //every itemTitle has two children, first is a smallLabel and second is a largeLabel. these two are type of AppCompatTextView
            ((TextView)((BaselineLayout) itemTitle).getChildAt(0)).setTypeface(fontFace, Typeface.BOLD);
            ((TextView)((BaselineLayout) itemTitle).getChildAt(1)).setTypeface(fontFace, Typeface.BOLD);
        }
    }
}

Ensuite, utilisez-le comme ceci:

<your.package.name.ExtendedBottomNavigationView Android:id="@id/bottomMenu" style="@style/bottomMenu"/>
5
Arash

Per https://material.io/develop/Android/components/bottom-navigation-view/ , il suffit de définir un élément fontFamily pour le style TextAppearance.MaterialComponents.Caption et son travail juste. com.google.Android.material.bottomnavigation.BottomNavigationView l'utilisera par défaut.

Il vous suffit de connaître les autres composants qui dépendent de TextAppearance.MaterialComponents.Caption avec get modifié également, mais cela peut être souhaitable.

<style name="TextAppearance.MaterialComponents.Caption" parent="AppMaterialComponentsTheme">
        <item name="fontFamily">@font/example</item>
</style>
2
Bink

si vous avez un CustomFont dans Asset Folder et que vous souhaitez définir dans votre navigation inférieure utilisez ce code 

  public class Font extends AppCompatActivity {
        public static void persian_iran_font(final Context context, final View v) {
            try {
                if (v instanceof ViewGroup) {
                    ViewGroup vg = (ViewGroup) v;
                    for (int i = 0; i < vg.getChildCount(); i++) {
                        View child = vg.getChildAt(i);
                        persian_iran_font(context, child);
                    }
                } else if (v instanceof TextView) {
                    ((TextView) v).setTypeface(Typeface.createFromAsset(context.getAssets(), "teshrinarmedium.otf"));
                }
            } catch (Exception e) {
            }
        }
    }

Et utilisez ensuite Font Class dans votre MainActivity

  BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
    Font.persian_iran_font(getApplicationContext(), navigation);

Bonne chance

0
Mr_3ecurityy
public void setNavigationTypeface() {
        final Typeface avenirHeavy = Typeface.createFromAsset(this.getAssets(), "font2/Avenir-Heavy.ttf"); //replace it with your own font
        ViewGroup navigationGroup = (ViewGroup) bottomNavView.getChildAt(0);
        for (int i = 0; i < navigationGroup.getChildCount(); i++) {
            ViewGroup navUnit = (ViewGroup) navigationGroup.getChildAt(i);
            for (int j = 0; j < navUnit.getChildCount(); j++) {
                View navUnitChild = navUnit.getChildAt(j);
                if (navUnitChild instanceof BaselineLayout) {
                    BaselineLayout baselineLayout = (BaselineLayout) navUnitChild;
                    for (int k = 0; k < baselineLayout.getChildCount(); k++) {
                        View baselineChild = baselineLayout.getChildAt(k);
                        if (baselineChild instanceof TextView) {
                            TextView textView = (TextView) baselineChild;
                            textView.setTypeface(avenirHeavy);
                        }
                    }
                }
            }
        }
    }
0
Ajitesh Shukla

Si vous voulez changer la sélection de texte dynamiquement lors de la sélection, vous pouvez faire bottomNav.itemTextAppearanceActive = R.style.yourstyle

0
iamsujan