2017-07-17 18 views
2

我正在使用BottomNavigationView来管理片段。有更改选项卡项目字体的简单解决方案吗?我使用SpannableStringBuilder。但它不起作用。BottomNavigationView - 如何更改菜单项的字体?

 for (int i = 0; i < bottomBar.getMenu().size(); i++) { 
      MenuItem menuItem = binding.bottomBar.getMenu().getItem(i); 
      SpannableStringBuilder title = new SpannableStringBuilder(menuItem.getTitle()); 
      title.setSpan(mTypeface, 0, title.length(), 0); 
      menuItem.setTitle(title); 
     } 
+1

见[链接](https://stackoverflow.com/a/10741161/1512199) – santalu

+0

是的,我看到了这个答案。感谢您的帮助@santalu – sorunluadam

回答

4

最后我找到了解决办法。首先我找到了CustonTypefaceSpan类。 CustomTypefaceSpan从TypefaceSpan类扩展而来。你可以检查this answer

 CustomTypefaceSpan typefaceSpan = new CustomTypefaceSpan("", mTypeface); 
     for (int i = 0; i <bottomBar.getMenu().size(); i++) { 
      MenuItem menuItem = bottomBar.getMenu().getItem(i); 
      SpannableStringBuilder spannableTitle = new SpannableStringBuilder(menuItem.getTitle()); 
      spannableTitle.setSpan(typefaceSpan, 0, spannableTitle.length(), 0); 
      menuItem.setTitle(spannableTitle); 
     } 
0

我认为这很简单。覆盖onLayout方法BottomNavigationView类然后你可以使用扩展标签。这也显示所有菜单标题并禁用移位。

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

然后使用它是这样的:

<your.package.name.ExtendedBottomNavigationView android:id="@id/bottomMenu" style="@style/bottomMenu"/> 
相关问题