2016-10-21 2 views
14

Я пытаюсь изменить TextSize из BottomNavigationView от андроида поддержки библиотеки 25.0.0Пользовательское TextSize из BottomNavigationView Android поддержки

<android.support.design.widget.BottomNavigationView 
     android:id="@+id/bottom_navigation_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:background="@color/colorPrimaryDark" 
     android:foregroundTint="@color/colorAccent" 
     app:itemIconTint="@android:color/white" 
     app:itemTextColor="@android:color/white" 
     app:layout_anchor="@id/lyt_container" 
     app:layout_anchorGravity="bottom" 
     app:itemTextAppearance="@style/TextStyleBNV" 
     app:menu="@menu/nav_menu" /> 

<style name="TextStyleBNV"> 
     <item name="android:textSize">@dimen/twelve_sp</item> 
     <item name="android:padding">0dp</item> 
     <item name="textAllCaps">false</item> 
    </style> 

Есть что-нибудь мне не хватает.

+0

ссылка http://stackoverflow.com/questions/31204320/how-can-i-change-the-navigationviews-item-text-size – sasikumar

+0

design_bottom_navigation_item.xml нет в папке sdk для дополнительных проектов. Я не могу переопределить его. – sector11

ответ

55

К сожалению, эта первая версия BottomNavigationView имеет множество ограничений. И пока вы не можете изменить размер титров, используя API-интерфейс поддержки. Таким образом, чтобы решить это ограничение в то время как Google не реализует его, вы можете сделать:

В вашем dimen.xml вы можете поставить:

<dimen name="design_bottom_navigation_text_size" tools:override="true">30sp</dimen> 
    <dimen name="design_bottom_navigation_active_text_size" tools:override="true">30sp</dimen> 

Делая это, вы перекрывая значение по умолчанию Димена, что внутренняя классы использования BottomNavigationView. Будьте осторожны.

+1

Эта работа как шарм. Спасибо вам, sanford – sector11

+0

@ Sanf0rd Я хочу сделать что-то подобное для других атрибутов, но не знаю, где искать имена для добавления переопределения стиля. Можете ли вы указать мне, где искать? // Боковое примечание: я хочу изменить боковое наложение выбранного элемента BottomNavigation, когда в меню находятся 5 элементов. Он выглядит waaay больше, чем показано на руководящих принципах, странный способ реализации «официального» решения. – quezak

+1

Я просто искал внутри внутренних классов и файлы макета bottomNavigation. – Sanf0rd

0

вы можете изменить его следующим образом. Вы должны только khow идентификатор этикеток, что поддержка Google, используемой

BottomNavigationView bottomNavigationView = (BottomNavigationView) fragmentActivity.findViewById(R.id.bottom_navigation); 
    TextView textView = (TextView) bottomNavigationView.findViewById(R.id.menu_item_home).findViewById(R.id.largeLabel); 
    textView.setTextSize(8); 

LargeLabel является идентификатором метки, Google использовал в своей библиотеке

+0

спасибо @boshra, похоже, уже решил. – sector11

1

Другим решением является использование Spannable для регулировки цвета размера, шрифта или другой текст атрибуты ....

private static class MenuSpannable extends MetricAffectingSpan{ 
     int color = Color.RED; 
     int size = 40; 

     public MenuSpannable() { 
      setSelected(false); 
     } 

     @Override 
     public void updateMeasureState(TextPaint p) { 
      p.setColor(color); 
      p.setTextSize(size); 
      /* p.setText --- whatever --- */ 
     } 

     @Override 
     public void updateDrawState(TextPaint tp) { 
      tp.setColor(color); 
      tp.setTextSize(size); 
      /* tp.setText --- whatever --- */ 
     } 
     private void setSelected(boolean selected){ 
      if(selected){ 
       color = Color.RED; 
       size = 40; 
      }else{ 
       color = Color.BLUE; 
       size = 20; 
      } 
     } 
} 

И затем установить срок для любого пункта меню ...

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     BottomNavigationView mBottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_menu); 
     final Menu menu = mBottomNavigationView.getMenu(); 
     final Font font = Font.getFromContext(this); 
     for(int i = 0; i < menu.size(); i++) { 
      SpannableString spannableString = new SpannableString(menu.getItem(i).getTitle()); 
      spannableString.setSpan(new MenuSpannable(),0,spannableString.length(),0); 
      menu.getItem(i).setTitle(spannableString); 
     } 
} 

В случае, если вы хотите, чтобы текст изменить с состоянием выбора

mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      Menu menu = mBottomNavigationView.getMenu(); 
      for(int i = 0; i < menu.size(); i++) { 
       MenuSpannable menuSpannable = new MenuSpannable(); 
       menuSpannable.setSelected(item.getItemId() == menu.getItem(i).getItemId()); 
       SpannableString sString = new SpannableString(menu.getItem(i).getTitle()); 
       sString.setSpan(menuSpannable,0,sString.length(),0); 
       menu.getItem(i).setTitle(sString); 
       } 
      return false; 
      } 
     }); 
0

Чтобы сделать это, я просто решил переопределить расположение навигации пункт:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="24dp" 
     android:layout_height="24dp" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="@dimen/design_bottom_navigation_margin" 
     android:layout_marginBottom="@dimen/design_bottom_navigation_margin" 
     android:duplicateParentState="true" /> 
    <android.support.design.internal.BaselineLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|center_horizontal" 
     android:clipToPadding="false" 
     android:paddingBottom="10dp" 
     android:duplicateParentState="true"> 
     <TextView 
      android:id="@+id/smallLabel" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="@dimen/design_bottom_navigation_text_size" 
      android:singleLine="true" 
      android:duplicateParentState="true" /> 
     <TextView 
      android:id="@+id/largeLabel" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:visibility="invisible" 
      android:textSize="@dimen/design_bottom_navigation_active_text_size" 
      android:singleLine="true" 
      android:duplicateParentState="true" /> 
    </android.support.design.internal.BaselineLayout> 
</merge> 

Просто убедитесь, что вы называете это design_bottom_navigation_item

+0

выглядит классно, мне нужно попробовать это. – sector11