web-dev-qa-db-fra.com

Modification de la couleur du texte d'un élément de menu dans le tiroir de navigation

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>
72
wasimsandhu

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);
        }
27
wasimsandhu
 <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" />
194
Neha Tyagi

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" />
37
icortesi

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

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

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));
5
SinToEn Dictionary

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
            }
    ));
3
DRM

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 ()

3
Chirag Joshi

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>
2
Chandan Singh

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é.

1
Vahid Amiri

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>
1
Babar Shamsi

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>
0
MarGin
 <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>
0

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"
0
Dhyan V

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" />
0
user3036876