我试图为我的应用添加夜间主题,并且我浪费了将近三个小时,只是试图让导航抽屉中的文字和图标变为白色以及深色背景。以下是我在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
<?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>
布尔值无关紧要,因为它有效。当夜间模式设置为开(0)时,导航抽屉中选择的任何菜单项都将变为白色。然而,这仅在选择每个项目时才会发生,这显然是不方便的。这是我的drawer_dark.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>
我在每个项目的透明背景上使用白色图标,但它们在导航抽屉的黑色背景上显示为黑色。我已经尝试过寻找xml解决方案来改变文本的颜色,而且我不知所措,因为我不知道为什么会被忽视。
有人能为我提供一个动态的解决方案来获得我想要实现的目标吗?感谢所有帮助,谢谢!
编辑:我没有使用第三方库,它是支持库中提供的NavigationView。这是XML布局:
current_user
答案 0 :(得分:200)
<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" />
答案 1 :(得分:37)
在NavigationView中使用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" />
答案 2 :(得分:27)
NavigationView
有一个名为setItemTextColor()
的方法。它使用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);
Here是我得到答案的地方。然后在分配我的NavigationView之后:
if (nightMode == 0) {
navigationView.setItemTextColor(csl);
navigationView.setItemIconTintList(csl2);
}
答案 3 :(得分:11)
更多选项:
您还可以通过覆盖&#34; textColorSecondary&#34;
来更改群组标题在styles.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"/>
答案 4 :(得分:7)
在您的NavigationView中添加 app:itemTextColor =“#fff”
<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"/>
答案 5 :(得分:5)
我使用下面的代码更改了我的应用中的导航抽屉文字颜色。
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setItemTextColor(ColorStateList.valueOf(Color.WHITE));
答案 6 :(得分:3)
在未来,如果有人来这里使用, 导航抽屉活动(由Studio在“活动提示”窗口中提供)
答案是 -
在MainActivity中的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);
并在MainActivity中的onNavigationItemSelected()中使用它(如果使用Navigation Drawer活动,则不需要编写此函数,它将添加到MainActivity中)。
NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
nav.setItemTextColor(csl);
nav.setItemIconTintList(csl2);
nav.setItemBackgroundResource(R.color.white);
提示 - 在onNavigationItemSelected()
中的If else Condition之前添加此代码答案 7 :(得分:3)
在java类中尝试这个
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
}
));
答案 8 :(得分:2)
这对我有用。可以代替customTheme来设置主题样式。在此代码中,您还可以更改字体和文本大小。
update t join
(select t.*, row_number() over (partition by group_column order by group_column) as seqnum
from t
) tt
on t.id = tt.id
set column_to_fill = seqnum - 1;
这是我的导航视图
<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>
答案 9 :(得分:2)
就我而言,我只需要更改一个菜单项的颜色-“注销”。我必须进行递归并更改标题颜色:
onPaste: function() {
let clipped = event.clipboardData.getData('text').split("\n");
clipped.forEach(item => {
this.todos.push({
text: item, done: false
})
})
// instead of this
// this.todo = ''
// make this
setTimeout(() => {
this.todo = ''
}, 0);
}
我是在Activity的onCreate方法中完成的。
答案 10 :(得分:1)
您还可以定义从基本主题派生的自定义主题:
<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>
您还可以将更多属性应用于自定义主题。
答案 11 :(得分:1)
您只需将主题添加到导航视图即可。
<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>
答案 12 :(得分:1)
这可能对我有用
转到activity_“导航活动名称” 在NavigationView内插入此代码
app:itemTextColor="color of your choice"
答案 13 :(得分:1)
要更改单个项目的单独文本颜色,请使用如下所示的SpannableString:
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);
答案 14 :(得分:0)
<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
设置项目背景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>
答案 15 :(得分:0)
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"
android:fitsSystemWindows="true"
app:itemTextColor="@color/colorPrimary"
app:itemIconTint="@color/colorPrimary"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
答案 16 :(得分:0)
您可以在以下位置使用可绘制对象
app:itemTextColor app:itemIconTint
然后您可以使用drawable控制选中状态和正常状态
<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>
答案 17 :(得分:0)
更改导航抽屉的文本颜色
我们使用
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"
/>