J'essaie d'ajouter un thème nocturne à mon application et j'ai perdu près de trois heures à essayer de faire en sorte que le texte et les icônes de mon tiroir de navigation deviennent blancs avec le fond sombre. Voici comment j'essaie de faire cela dans onCreate()
dans 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);
}
Le nightMode
boolean n'est pas pertinent car cela fonctionne. Lorsque le mode nuit est activé (0), l'élément de menu sélectionné dans le tiroir de navigation devient blanc. Cependant, cela ne se produit que lorsque chaque élément est sélectionné, ce qui est évidemment gênant. Voici mon tiroir_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>
J'utilise des icônes blanches sur un fond transparent pour chaque élément, mais elles apparaissent en noir sur le fond noir du tiroir de navigation. J'ai essayé de chercher une solution XML pour changer la couleur du texte et je me gratte la tête parce que je ne sais pas pourquoi cela a été négligé.
Quelqu'un peut-il m'offrir une solution dynamique pour obtenir ce que j'essaie de réaliser? Toute aide est appréciée, merci!
EDIT: Je n’utilise pas de bibliothèque tierce, c’est la NavigationView fournie dans la bibliothèque de support. Voici la mise en page 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>
NavigationView
a une méthode appelée setItemTextColor()
. Il utilise un 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);
Ici c'est là que j'ai eu cette réponse. Et puis juste après avoir assigné mon NavigationView:
if (nightMode == 0) {
navigationView.setItemTextColor(csl);
navigationView.setItemIconTintList(csl2);
}
<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" />
Utilisez app: itemIconTint dans votre NavigationView, par exemple:
<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" />
Plus d'options:
vous pouvez également changer le titre du groupe en remplaçant "textColorSecondary"
Dans vos styles.xml
<style name="AppTheme.NavigationView">
<item name="Android:textColorSecondary">#FFFFFF</item>
</style>
Dans votre mise en page
<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: itemTextColor = "# fff" dans votre NavigationView comme
<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"/>
J'ai utilisé le code ci-dessous pour changer la couleur du texte du tiroir de navigation dans mon application.
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setItemTextColor(ColorStateList.valueOf(Color.WHITE));
essayez ceci en classe 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
}
));
Dans le futur si quelqu'un vient ici en utilisant, Navigation Drawer Activity (fourni par Studio dans la fenêtre d'invite d'activité)
La réponse est -
Utilisez ceci avant OnCreate () dans MainActivity
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);
et l'utiliser dans onNavigationItemSelected () dans MainActivity (vous n'avez pas besoin d'écrire cette fonction si vous utilisez l'activité du tiroir de navigation, elle sera ajoutée dans MainActivity).
NavigationView nav = (NavigationView) findViewById(R.id.nav_view);
nav.setItemTextColor(csl);
nav.setItemIconTintList(csl2);
nav.setItemBackgroundResource(R.color.white);
Astuce - ajoutez ce code avant If else Condition dans onNavigationItemSelected ()
Cela fonctionne pour moi. à la place de customTheme, vous pouvez placer votre thème dans des styles. dans ce code, vous pouvez également changer la police et la taille du texte.
<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>
voici ma vue de navigation
<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>
Vous pouvez également définir un thème personnalisé dérivé de votre thème de base:
<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" />
et ensuite dans votre fichier styles.xml:
<style name="MyTheme.NavMenu" parent="MyTheme.Base">
<item name="Android:textColorPrimary">@color/yourcolor</item>
</style>
vous pouvez également appliquer plus d'attributs au thème personnalisé.
Vous pouvez le faire simplement en ajoutant votre thème à votre vue de navigation.
<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"/>
et dans votre fichier style.xml, vous ajouterez ce thème
<style name="AppTheme.NavigationView" >
<item name="colorPrimary">@color/text_color_changed_onClick</item>
<item name="Android:textColorPrimary">@color/Your_default_text_color</item>
</style>
Vous pouvez utiliser des drawables dans
app: itemTextColor app: itemIconTint
alors vous pouvez contrôler l'état vérifié et l'état normal en utilisant un 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">
tiroir_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>
<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" />
Pour définir un arrière-plan d'élément à l'aide de app: itemBackground
draw_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>
Cela peut aider Cela a fonctionné pour moi
Allez à activity_ "nom de l'activité de navigation" Dans NavigationView, insérez ce code.
app:itemTextColor="color of your choice"
itemIconTint, si vous voulez changer la couleur de l'icône
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" />