Как изменить размер текста элемента NavigationView?

Недавно Google выпустил виджет android.support.design.widget.NavigationView как часть библиотеки com.android.support:design:22.2.0 , которая значительно упростила (и стандартизирует) процесс создания NavigationDrawer.

Однако, согласно спецификациям дизайна , элемент списка должен быть Roboto Medium, 14sp, 87% # 000000 . NavigationView предоставляет textSize или textStyle для настройки.

Технические характеристики материаловИнформация о шрифте

Каковы мои варианты, если я педантичен в отношении того, чтобы поддерживать правильные спецификации дизайна, используя предоставленный Google NavigationView (или настраивая его каким-либо другим способом)?

Solutions Collecting From Web of "Как изменить размер текста элемента NavigationView?"

Начиная с Android Support Library 22.2.1, Google изменил значение по умолчанию textSize элементов в NavigationView с 16sp до 14sp, что хорошо подходит для руководства по дизайну материалов. Однако, в некоторых случаях (например, когда вы хотите поддерживать китайский язык), кажется, что больше textSize лучше. Решение прост:

  1. Добавьте app:theme="@style/yourStyle.Drawer" в ваш NavigationView в вашем layout.xml
  2. В styles.xml, добавьте android:textSize="16sp" в стиле yourStyle.Drawer

Создать стиль

 <style name="NavigationDrawerStyle"> <item name="android:textSize">20sp</item><!-- text size in menu--> <item name="android:listPreferredItemHeightSmall">40dp</item><!-- item size in menu--> </style> 

Добавьте его в свой файл main_layout.xml

  <android.support.design.widget.NavigationView ... app:theme="@style/NavigationDrawerStyle" ....> </android.support.design.widget.NavigationView> 

Все параметры, которые вы можете изменить, здесь изменяют элементы навигации. Создайте макет с именем design_navigation_item.xml.

 <android.support.design.internal.NavigationMenuItemView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?attr/listPreferredItemHeightSmall" android:paddingLeft="?attr/listPreferredItemPaddingLeft" android:paddingRight="?attr/listPreferredItemPaddingRight" android:drawablePadding="@dimen/navigation_icon_padding" android:gravity="center_vertical|start" android:maxLines="1" android:fontFamily="sans-serif-thin" android:textSize="22sp" android:textAppearance="?attr/textAppearanceListItem" /> 

Все макеты, которые могут быть переопределены, расположены здесь ...\sdk\extras\android\support\design\res\layout\

 design_layout_snackbar.xml design_layout_snackbar_include.xml design_layout_tab_icon.xml design_layout_tab_text.xml design_navigation_item.xml design_navigation_item_header.xml design_navigation_item_separator.xml design_navigation_item_subheader.xml design_navigation_menu.xml 

Вы можете настроить все, от цвета текста до размера и шрифта в вашем стиле.xml

 <style name="NavDrawerTextStyle" parent="Base.TextAppearance.AppCompat"> <item name="android:textColor">@color/colorPrimaryDark</item> <item name="android:textSize">16sp</item> <item name="android:textStyle">bold</item> </style> 

А затем в вашем NavigationView :

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <android.support.design.widget.NavigationView ... app:itemTextAppearance="@style/NavDrawerTextStyle" /> 

Вы можете использовать эти атрибуты внутри xml-файла

 app:itemTextAppearance="?android:attr/textAppearanceMedium" 

Или для небольшого текста

 app:itemTextAppearance="?android:attr/textAppearance" 

Или для большого текста

 app:itemTextAppearance="?android:attr/textAppearanceLarge" 

Исчерпав исходный код, я нашел этот файл макета

/platform/frameworks/support/…/design/res/layout/design_drawer_item.xml

Со следующим атрибутом

 <android.support.design.internal.NavigationMenuItemView ... android:textAppearance="?attr/textAppearanceListItem" 

Это означало, что мы должны были переопределить стиль textAppearanceListItem в нашем проекте.


RES / значения / styles.xml

 <style name="AppTheme" ... > ... <item name="textAppearanceListItem">@style/list_item_appearance</item> </style> <style name="list_item_appearance"> <item name="android:textSize">14sp</item> <item name="android:fontFamily">sans-serif-medium</item> </style> 

Я не совсем уверен, что еще это повлияет, но если у кого-то будет лучший ответ, я был бы рад принять это!

Это сработало для меня:

activity_main.xml

 <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:theme="@style/NavigationDrawerStyle" app:headerLayout="@layout/navdrawer_header" app:menu="@menu/navdrawer_menu" /> 

styles.xml

 <style name="NavigationDrawerStyle"> <item name="android:textSize">16sp</item> </style> 

Может быть, это может помочь. Недавно мне пришлось делать это программно. Я использовал этот класс:

 public class CustomTypefaceSpan extends TypefaceSpan { private final Typeface newType; private final float newSp; public CustomTypefaceSpan(String family, Typeface type, float sp) { super(family); newType = type; newSp = sp; } @Override public void updateDrawState(TextPaint ds) { applyCustomTypeFace(ds, newType, newSp); } @Override public void updateMeasureState(TextPaint paint) { applyCustomTypeFace(paint, newType, newSp); } private static void applyCustomTypeFace(Paint paint, Typeface tf, float sp) { int oldStyle; Typeface old = paint.getTypeface(); if (old == null) { oldStyle = 0; } else { oldStyle = old.getStyle(); } int fake = oldStyle & ~tf.getStyle(); if ((fake & Typeface.BOLD) != 0) { paint.setFakeBoldText(true); } if ((fake & Typeface.ITALIC) != 0) { paint.setTextSkewX(-0.25f); } paint.setTextSize(sp); paint.setTypeface(tf); } @SuppressWarnings("unused") public static final Parcelable.Creator<CustomTypefaceSpan> CREATOR = new Parcelable.Creator<CustomTypefaceSpan>() { @Override public CustomTypefaceSpan createFromParcel(Parcel in) { return null; } @Override public CustomTypefaceSpan[] newArray(int size) { return new CustomTypefaceSpan[size]; } }; } 

Затем я использовал вот так:

 // This is for color SpannableString s = new SpannableString(item.getTitle().toString()); s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0); // This is for typeface and size Typeface typeFace = Functions.getTypeface(this, "Avenir"); if (typeFace != null) { int size = 19; float scaledSizeInPixels = size * getResources().getDisplayMetrics().scaledDensity; CustomTypefaceSpan spanTypeFace = new CustomTypefaceSpan(item.getTitle().toString(), typeFace, scaledSizeInPixels); s.setSpan(spanTypeFace, 0, s.length(), 0); } item.setTitle(s); 

Надеюсь это поможет.

Список адаптеров Макет панели навигации:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:orientation="horizontal" android:background="@drawable/pressed_state"> <TextView android:id="@+id/textView_list_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@+id/imageView_icons" android:textStyle="bold" android:layout_marginLeft="10dp" android:textColor="@color/white" android:textSize="17sp" /> <ImageView android:id="@+id/list_adapter_image" android:layout_width="10dp" android:layout_height="10dp" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:visibility="visible" android:layout_marginRight="50dp" android:background="@drawable/circle_orange"/> </RelativeLayout> <LinearLayout android:layout_height="1dp" android:layout_width="match_parent" android:background="#EC1294"></LinearLayout> </LinearLayout> 1 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:orientation="horizontal" android:background="@drawable/pressed_state"> <TextView android:id="@+id/textView_list_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@+id/imageView_icons" android:textStyle="bold" android:layout_marginLeft="10dp" android:textColor="@color/white" android:textSize="17sp" /> <ImageView android:id="@+id/list_adapter_image" android:layout_width="10dp" android:layout_height="10dp" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:visibility="visible" android:layout_marginRight="50dp" android:background="@drawable/circle_orange"/> </RelativeLayout> <LinearLayout android:layout_height="1dp" android:layout_width="match_parent" android:background="#EC1294"></LinearLayout> </LinearLayout> 

Этот параметр в RelativeLayout установил цвет фона -> android: background = "@ drawable / press_state"

Сделайте это «нажато_state.xml» в папке с возможностью переноса.

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@color/light_blue" android:state_pressed="true"/> 

Извините меня за мой английский.