Program Tip

NavigationView의 항목 텍스트 크기를 어떻게 변경할 수 있습니까?

programtip 2020. 12. 9. 21:37
반응형

NavigationView의 항목 텍스트 크기를 어떻게 변경할 수 있습니까?


Google은 최근 에 NavigationDrawer 생성 프로세스를 크게 단순화 (및 표준화) 하는 android.support.design.widget.NavigationView위젯을 com.android.support:design:22.2.0라이브러리의 일부로 출시 했습니다 .

그러나 디자인 사양 에 따라 목록 항목은 Roboto Medium, 14sp, 87 % # 000000 이어야합니다 . NavigationView노출은 아니오 textSize또는 textStyle사용자 정의합니다.

머티리얼 디자인 사양 글꼴 스타일 정보

Google에서 제공NavigationView 하는 올바른 설계 사양 유지 하거나 다른 방식으로 사용자 정의하는 것에 대해 현명한 경우 어떻게해야 합니까?


Android 지원 라이브러리 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

파일에서 새 스타일 만들기 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>

당신의 main_layout.xml

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


    </android.support.design.widget.NavigationView>

탐색 항목의 모든 매개 변수 (변경할 수 있음)는 여기 (파일 경로 ...\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" />

또한 당신은 대체 할 수 있습니다 *.xml파일 (복사 파일을 ...\sdk\extras\android\support\design\res\layout\design_navigation_item.xml사용자의 단지에) app/src/main/res/layout폴더가 같은 이름 레이아웃을 생성 design_navigation_item.xml.

덮어 쓸 수있는 모든 레이아웃이 여기에 있습니다. ...\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

[업데이트]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
    ...
    android:itemTextAppearance="@style/NavDrawerTextStyle"
     />


xml 파일 내에서이 속성을 사용할 수 있습니다.

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

또는 작은 텍스트

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

또는 큰 텍스트

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

이것은 나를 위해 일했습니다.

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>

소스 코드를 살펴보면서이 레이아웃 파일을 찾았습니다.

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

다음 속성

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

즉, 우리가해야 할 일은 textAppearanceListItem프로젝트 스타일 을 재정의하는 것뿐이었습니다.


res / values ​​/ 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>

나는 이것이 다른 어떤 영향을 미칠지 완전히 확신하지 못하지만 누군가가 더 나은 대답을 가지고 있다면 대신 그것을 받아 들일 것입니다!


아마도 도움이 될 것입니다. 최근에 저는 이것을 프로그래밍 방식으로해야했습니다. 이 수업을 사용했습니다.

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"

드로어 블 폴더에 "pressed_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"/>

제 영어 실례합니다.


activity_main.xml로 이동하여 디자인에서 nav_view를 선택 하고 다음과 같이 itemTextAppearanceitemTextColor 를 업데이트하여 메뉴 항목 텍스트 크기를 변경할 수 있습니다.navigation_view_item_style


  1. values ​​\ dimens.xml 열기 또는 만들기
  2. 이 코드를 추가하십시오.
<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>

작동합니다

참고 URL : https://stackoverflow.com/questions/31204320/how-can-i-change-the-navigationviews-item-text-size

반응형