如何更改NavigationView的项目文字大小?

Google 最近发布了android.support.design.widget.NavigationView小部件作为com.android.support:design:22.2.0库的一部分,这大大简化了(并标准化)了创buildNavigationDrawer的过程。

但根据devise规格 ,列表项应该是Roboto Medium,14sp,87%#000000NavigationView暴露textSizetextStyle来定制这个。

材料设计规格字体样式信息

如果我对使用Google提供的NavigationView (或以任何其他方式定制)保持正确的devise规格迂腐,我有什么select?

Solutions Collecting From Web of "如何更改NavigationView的项目文字大小?"

自Android支持库22.2.1以来,Google已经将NavigationView的项目的默认文本大小从16sp更改为14sp,这很适合材料devise指南。 但是,在某些情况下(例如,当你想支持中文的时候),看起来textSize越大越好。 解决方法很简单:

  1. 添加app:theme="@style/yourStyle.Drawer"到您的layout.xml中的NavigationView
  2. 在styles.xml中,以样式yourStyle.Drawer添加android:textSize="16sp"

创造风格

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

你可以改变的所有参数在这里改变导航项目。 创build一个名为design_navigation_item.xml.的布局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" /> 

所有可以Overriden的布局都位于这里...\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 

[UPDATE] com.android.support:design-{version} lib的每个版本都有不同的项目可以覆盖。 检查所有你需要的东西

在这里输入图像说明

您可以在style.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> 

在RelativeLayout中这个参数设置背景色 – > android:background =“@ drawable / pressed_state”

在drawable文件夹中创build这个“pressed的压缩文件”。

 <?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"/> 

请原谅我的英语。