2017-07-17 21 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"/> 
相關問題