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!
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
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>
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"/>
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>
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
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);
}
}
}
}
}
}
Si vous voulez changer la sélection de texte dynamiquement lors de la sélection, vous pouvez faire bottomNav.itemTextAppearanceActive = R.style.yourstyle