탐색 드로어에서 메뉴 항목의 텍스트 색상 변경
앱에 야간 테마를 추가하려고 하는데 내비게이션 서랍의 텍스트와 아이콘이 어두운 배경과 함께 흰색으로 변하도록 하는 데에만 거의 3시간을 허비했습니다.이것이 제가 시도하고 있는 방법입니다.onCreate()
인에MainActivity.java
:
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// This method will trigger onItemClick of navigation menu
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// Checking if the item is in checked state or not, if not make it in checked state
if (menuItem.isChecked())
menuItem.setChecked(false);
else menuItem.setChecked(true);
if (nightMode == 0) {
SpannableString spanString = new SpannableString(menuItem.getTitle().toString());
spanString.setSpan(new ForegroundColorSpan(Color.WHITE), 0, spanString.length(), 0); // fix the color to white
menuItem.setTitle(spanString);
}
그nightMode
부울은 작동하기 때문에 무관합니다.야간 모드를 on(0)으로 설정하면 탐색 드로어에서 선택한 모든 메뉴 항목이 흰색으로 바뀝니다.하지만, 각 항목을 선택할 때에만 발생하기 때문에 불편할 수밖에 없습니다.여기 내 drawer_dark.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
android:checkableBehavior="single">
<item
android:id="@+id/unitone"
android:checked="true"
android:icon="@drawable/one_white"
android:title="Classical Period" />
<item
android:id="@+id/unittwo"
android:checked="false"
android:icon="@drawable/two_white"
android:title="Postclassical Period" />
<item
android:id="@+id/unitthree"
android:checked="false"
android:icon="@drawable/three_white"
android:title="Early Modern Era" />
<item
android:id="@+id/unitfour"
android:checked="false"
android:icon="@drawable/four_white"
android:title="Dawn of Industrial Age" />
<item
android:id="@+id/unitfive"
android:checked="false"
android:icon="@drawable/five_white"
android:title="Modern Era" />
</group>
</menu>
저는 각 항목마다 투명한 배경에 흰색 아이콘을 사용하고 있는데 내비게이션 드로어의 검은색 배경에 검은색으로 표시됩니다.텍스트의 색을 바꾸는 xml 솔루션을 찾으려고 했는데 왜 이것을 간과했는지 모르겠어서 머리를 긁적이고 있습니다.
누군가 제가 이루고자 하는 것을 얻기 위해 역동적인 해결책을 제시해 주실 수 있나요?모든 도움에 감사드립니다, 감사합니다!
편집: 타사 라이브러리를 사용하는 것이 아니라 지원 라이브러리에 제공된 탐색 보기입니다.XML 레이아웃은 다음과 같습니다.
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="7dp"
tools:context=".MainActivity"
android:fitsSystemWindows="true" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/ColorDark" />
<include layout="@layout/toolbar" />
</FrameLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:background="#000"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/header"
app:menu="@menu/drawer" />
</android.support.v4.widget.DrawerLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:background="#000"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/header"
app:itemTextColor="your color"
app:menu="@menu/drawer" />
Navigation View에서 app:itemIconTint 사용, ej:
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:itemTextColor="@color/customColor"
app:itemIconTint="@color/customColor"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_home"
app:menu="@menu/activity_home_drawer" />
NavigationView
라는 방법이 있습니다.setItemTextColor()
. A를 사용합니다.ColorStateList
.
// FOR NAVIGATION VIEW ITEM TEXT COLOR
int[][] state = new int[][] {
new int[] {-android.R.attr.state_enabled}, // disabled
new int[] {android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_checked}, // unchecked
new int[] { android.R.attr.state_pressed} // pressed
};
int[] color = new int[] {
Color.WHITE,
Color.WHITE,
Color.WHITE,
Color.WHITE
};
ColorStateList csl = new ColorStateList(state, color);
// FOR NAVIGATION VIEW ITEM ICON COLOR
int[][] states = new int[][] {
new int[] {-android.R.attr.state_enabled}, // disabled
new int[] {android.R.attr.state_enabled}, // enabled
new int[] {-android.R.attr.state_checked}, // unchecked
new int[] { android.R.attr.state_pressed} // pressed
};
int[] colors = new int[] {
Color.WHITE,
Color.WHITE,
Color.WHITE,
Color.WHITE
};
ColorStateList csl2 = new ColorStateList(states, colors);
제가 그 답을 얻은 곳은 여기입니다.그런 다음 NavigationView를 할당한 직후:
if (nightMode == 0) {
navigationView.setItemTextColor(csl);
navigationView.setItemIconTintList(csl2);
}
기타 옵션:
"textColorSecondary"를 재정의하여 그룹 제목을 변경할 수도 있습니다.
style.xml 스타일로
<style name="AppTheme.NavigationView">
<item name="android:textColorSecondary">#FFFFFF</item>
</style>
레이아웃에서
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/activity_main_menu_drawer_drawer"
android:theme="@style/AppTheme.NavigationView"
app:itemIconTint="@color/colorPrimary"
app:itemTextColor="@color/white"/>
add app:itemNavigation에서 TextColor="#ffff" 보기
<android.support.design.widget.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:menu="@menu/slider_menu"
android:background="@color/colorAccent"
app:itemTextColor="#fff"
android:id="@+id/navigation_view"
android:layout_gravity="start"/>
아래 코드를 사용하여 앱에서 네비게이션 드로어 텍스트 색상을 변경했습니다.
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setItemTextColor(ColorStateList.valueOf(Color.WHITE));
탐색 드로어의 텍스트 색상을 변경하려면
우리가 사용하는app:itemTextColor="@color/white"
탐색 드로어의 색상을 변경합니다.
사용하다app:itemIconTint="@color/black"
<com.google.android.material.navigation.NavigationView
android:id="@+id/naView"
app:itemIconTint="@color/black"
android:layout_width="match_parent"
app:menu="@menu/navmenu"
app:itemTextColor="@color/white"
app:headerLayout="@layout/nav_header"
android:layout_height="match_parent"
app:itemTextAppearance="?android:textAppearanceMedium"
android:fitsSystemWindows="true"
android:layout_gravity="start"
/>
드로어를 사용할 수 있습니다.
앱:itemTextColor 앱:itemIconTint
그리고 나서 당신은 드로우블을 사용하여 체크된 상태와 정상 상태를 제어할 수 있습니다.
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:itemHorizontalPadding="@dimen/margin_30"
app:itemIconTint="@drawable/drawer_item_color"
app:itemTextColor="@drawable/drawer_item_color"
android:theme="@style/NavigationView"
app:headerLayout="@layout/nav_header"
app:menu="@menu/drawer_menu">
drawer_item_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/selectedColor" android:state_checked="true" />
<item android:color="@color/normalColor" />
</selector>
나중에 다른 사용자가 여기에 올 경우, 탐색 드로어 활동(활동 프롬프트 창의 Studio에서 제공)
답은 - 입니다.
기본 활동에서 OnCreate() 전에 사용
int[][] state = new int[][] {
new int[] {android.R.attr.state_checked}, // checked
new int[] {-android.R.attr.state_checked}
};
int[] color = new int[] {
Color.rgb(255,46,84),
(Color.BLACK)
};
ColorStateList csl = new ColorStateList(state, color);
int[][] state2 = new int[][] {
new int[] {android.R.attr.state_checked}, // checked
new int[] {-android.R.attr.state_checked}
};
int[] color2 = new int[] {
Color.rgb(255,46,84),
(Color.GRAY)
};
ColorStateList csl2 = new ColorStateList(state2, color2);
탐색 항목에서 이 항목을 사용합니다.주 활동(Navigation Drawer 활동을 사용하는 경우 이 기능을 쓸 필요가 없으며 주 활동에 추가됩니다.)에서 선택했습니다.
NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
nav.setItemTextColor(csl);
nav.setItemIconTintList(csl2);
nav.setItemBackgroundResource(R.color.white);
팁 - 탐색 항목에 조건을 추가하려면 이 코드를 먼저 추가합니다.선택()
이건 나한테 효과가 있어요. 관습 대신에테마를 스타일에 넣을 수 있습니다.이 코드에서 글꼴과 텍스트 크기를 변경할 수도 있습니다.
<style name="MyTheme.NavMenu" parent="CustomTheme">
<item name="android:textSize">16sp</item>
<item name="android:fontFamily">@font/ssp_semi_bold</item>
<item name="android:textColorPrimary">@color/yourcolor</item>
</style>
여기 나의 네비게이션이 있습니다.
<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:fitsSystemWindows="true"
app:theme="@style/MyTheme.NavMenu"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer">
<include layout="@layout/layout_update_available"/>
</android.support.design.widget.NavigationView>
네비게이션 보기에 테마를 추가하기만 하면 간단히 수행할 수 있습니다.
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
android:background="@color/colorPrimary"
android:theme="@style/AppTheme.NavigationView"
app:headerLayout="@layout/nav_header_drawer"
app:menu="@menu/activity_drawer_drawer"/>
style.xml 파일에 이 테마를 추가합니다.
<style name="AppTheme.NavigationView" >
<item name="colorPrimary">@color/text_color_changed_onClick</item>
<item name="android:textColorPrimary">@color/Your_default_text_color</item>
</style>
자바 수업에서 이것을 시도해 봅니다.
yourNavigationView.setItemTextColor(new ColorStateList(
new int [] [] {
new int [] {android.R.attr.state_pressed},
new int [] {android.R.attr.state_focused},
new int [] {}
},
new int [] {
Color.rgb (255, 128, 192),
Color.rgb (100, 200, 192),
Color.WHITE
}
));
이게 도움이 될지도 몰라요.
activity_"navigation activity name"으로 이동합니다.xml Inside NavigationView에 이 코드 삽입
app:itemTextColor="color of your choice"
단일 항목의 개별 텍스트 색상을 변경하려면 다음과 같이 SpannableString을 사용합니다.
NavigationView navDrawer;
Menu menu = navDrawer.getMenu();
SpannableString spannableString = new SpannableString("Menu item"));
spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary)), 0, spannableString.length(), 0);
menu.findItem(R.id.nav_item).setTitle(spannableString);
저 같은 경우는 '로그아웃'이라는 메뉴 항목 하나만 색상을 변경해야 했어요.재귀를 실행하고 제목 색상을 변경해야 했습니다.
NavigationView nvDrawer;
Menu menu = nvDrawer.getMenu();
for (int i = 0; i < menu.size(); i ++){
MenuItem menuItem = menu.getItem(i);
if (menuItem.getTitle().equals("Logout")){
SpannableString spanString = new SpannableString(menuItem.getTitle().toString());
spanString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(this, R.color.colorGreen)), 0, spanString.length(), 0);
menuItem.setTitle(spanString);
}
}
이 작업은 Activity's on Create 메서드에서 수행했습니다.
기본 테마에서 파생되는 사용자 지정 테마를 정의할 수도 있습니다.
<android.support.design.widget.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:id="@+id/nav_view"
app:headerLayout="@layout/nav_view_header"
app:menu="@layout/nav_view_menu"
app:theme="@style/MyTheme.NavMenu" />
styles.xml 파일에서 다음을 입력합니다.
<style name="MyTheme.NavMenu" parent="MyTheme.Base">
<item name="android:textColorPrimary">@color/yourcolor</item>
</style>
사용자 지정 테마에 더 많은 특성을 적용할 수도 있습니다.
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:itemBackground="@drawable/drawer_item_bg"
app:headerLayout="@layout/nav_header_home"
app:menu="@menu/app_home_drawer" />
app:itemBackground를 사용하여 ItemBackground를 설정하는 방법
drawer_item_bg.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" >
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:top="-2dp" android:right="-2dp" android:left="-2dp">
<shape>
<padding android:bottom="0dp" android:left="15dp" android:right="0dp" android:top="0dp"/>
<solid android:color="@android:color/transparent" />
<stroke
android:width="0.5dp"
android:color="#CACACA" />
</shape>
</item>
</layer-list>
항목IconTint 아이콘 색상을 변경하려면
android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:itemTextColor="@color/colorPrimary"
app:itemIconTint="@color/colorPrimary"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
언급URL : https://stackoverflow.com/questions/32042794/changing-text-color-of-menu-item-in-navigation-drawer
'programing' 카테고리의 다른 글
ODP.NET Managed - 요청한 항목을 찾을 수 없습니다.넷 프레임워크 데이터 프로바이더 (0) | 2023.09.17 |
---|---|
날짜에서 연도를 추출합니다. df['year'] = df['date'].연도가 작동하지 않습니다. (0) | 2023.09.17 |
XML Android 권한 목록 전체 (0) | 2023.09.17 |
printf의 가변 크기 패딩 (0) | 2023.09.17 |
Pandas DataFrame에서 잘못된 값을 없음으로 바꿉니다. (0) | 2023.09.17 |