How can I change the NavigationView's item text size?

后端 未结 10 1043
面向向阳花
面向向阳花 2020-12-02 07:32

Google recently released the android.support.design.widget.NavigationView widget as part of the com.android.support:design:22.2.0 library, which gr

相关标签:
10条回答
  • 2020-12-02 07:55

    List Adapter Layout of your Navigation bar:

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

    This param in RelativeLayout set the background color --> android:background="@drawable/pressed_state"

    Make this "pressed_state.xml" in drawable folder.

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

    Excuse me for my english.

    0 讨论(0)
  • 2020-12-02 07:56

    you can use this attributes inside xml file

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

    or for small text

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

    or for large text

    app:itemTextAppearance="?android:attr/textAppearanceLarge"
    
    0 讨论(0)
  • 2020-12-02 07:57

    Maybe it might help. Recently I had to do this programmatically. I used this class:

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

    Then I used like this:

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

    Hope this helps.

    0 讨论(0)
  • 2020-12-02 07:57
    1. Open or create values\dimens.xml
    2. Add this code:
    <dimen name="design_bottom_navigation_text_size" tools:override="true">11sp</dimen>
    <dimen name="design_bottom_navigation_active_text_size" tools:override="true">12sp</dimen>
    

    It should work

    0 讨论(0)
  • 2020-12-02 07:59

    Create new style at the file app/src/main/res/values/styles.xml

    <style name="NavigationDrawerStyle">
    
            <item name="android:textSize">20sp</item><!-- text size in menu-->
    
            <!-- item size in menu-->
            <item name="android:listPreferredItemHeightSmall">40dp</item>
            <item name="listPreferredItemHeightSmall">40dp</item>
    
            <!-- item padding left in menu-->
            <item name="android:listPreferredItemPaddingLeft">8dp</item>
            <item name="listPreferredItemPaddingLeft">8dp</item>
    
            <!-- item padding right in menu-->
            <item name="android:listPreferredItemPaddingRight">8dp</item>
            <item name="listPreferredItemPaddingRight">8dp</item>
        </style>
    

    Add it to your main_layout.xml

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

    All params of the navigation items (which you can change) are located here (path to file ...\sdk\extras\android\support\design\res\layout\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" />
    

    Also you can override *.xml file (copy file from ...\sdk\extras\android\support\design\res\layout\design_navigation_item.xml), just in your app/src/main/res/layout folder create a layout named the same design_navigation_item.xml.

    All layouts which can be Overriden are located here ...\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] Each version of com.android.support:design-{version} lib has different items to override. Check all what you need in

    [UPDATE 04/14/2020]

    If you are using com.google.android.material.navigation.NavigationView then open the class, and you will see:

    public NavigationView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, R.attr.navigationViewStyle);
      }
    

    So you can use attr navigationViewStyle to set your own style for the NavigationView via theme of your app:

    NB: parent theme of AppTheme should be Theme.MaterialComponents

        <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
       ...
    <item name="navigationViewStyle">@style/AppNavigationViewStyle</item>
       ...
        </style>
    
    <style name="AppNavigationViewStyle" parent="Widget.MaterialComponents.NavigationView">
            <item name="itemTextAppearance">@style/AppNavigationViewItemTextAppearance</item>
       </style>
    <style name="AppNavigationViewItemTextAppearance" parent="@style/TextAppearance.MaterialComponents.Subtitle2">
             <item name="android:textSize">18sp</item>
       </style>
    

    Just open parent theme to see all <item name attrs for override

    0 讨论(0)
  • 2020-12-02 08:03

    Since Android Support Library 22.2.1, Google has changed default textSize of items in NavigationView from 16sp to 14sp, which suits Material Design guideline well. However, in some cases(for example, when you want to support Chinese language), it seems larger textSize is better. Solution is simple:

    1. add app:theme="@style/yourStyle.Drawer" to your NavigationView in your layout.xml
    2. in styles.xml, add android:textSize="16sp" in style yourStyle.Drawer
    0 讨论(0)
提交回复
热议问题