web-dev-qa-db-fra.com

Comment changer la couleur du texte et de l'icône de l'élément de menu sélectionné dans le tiroir de navigation par programmation à l'aide de java

Je suis débutant en développement Android. En utilisant l'activité de tiroir de navigation par défaut d'Android, je développe une application. L'une des exigences de cette application est de changer les couleurs d'arrière-plan des mises en page (y compris la couleur de l'en-tête du tiroir de navigation) de manière aléatoire au moment de l'exécution. 

Maintenant, tout se passe bien, sauf que la couleur de l'élément de menu sélectionné dans le tiroir de navigation est toujours blue. comme ça :

 enter image description here

Maintenant, ce que je veux, c'est que la couleur de fond des autres mises en page est rose, l'élément de menu sélectionné dans la barre de navigation doit également être rose (je veux dire la couleur du texte et l'icône doit être rose) comme ceci:

 enter image description here

Est-ce que n'importe qui peut dire, s'il vous plaît, comment y parvenir par programmation dans le code, car je dois changer le texte sélectionné et les couleurs des icônes au moment de l'exécution de manière aléatoire.

Voici le fichier XML de menu pour référence:

<?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/nav_quiz_all"
                Android:icon="@drawable/ic_public_black_24dp"
                Android:checked="true"
                Android:title="All Countries Quiz"/>
        <item
                Android:id="@+id/nav_quiz_bookmarked"
                Android:icon="@drawable/ic_favorite_black_24dp"
                Android:title="Favorite Quiz"/>
    </group>


    <item Android:title="Communicate">
        <menu>
            <item
                Android:id="@+id/nav_rate"
                Android:icon="@drawable/ic_star_black_24dp"
                Android:title="Rate this app"/>
            <item
                Android:id="@+id/nav_share"
                Android:icon="@drawable/ic_share_black_24dp"
                Android:title="Share"/>
            <item
                Android:id="@+id/nav_feedback"
                Android:icon="@drawable/ic_feedback_black_24dp"
                Android:title="Feedback"/>
            <item
                Android:id="@+id/nav_about"
                Android:icon="@drawable/ic_info_black_24dp"
                Android:title="About"/>
        </menu>
    </item>


    <item
        Android:id="@+id/nav_settings"
        Android:icon="@drawable/ic_settings_black_24dp"
        Android:title="Settings"/>

</menu>
14
Kuldeep Kumar

Tout d’abord, merci à tous d’avoir répondu avec vos solutions :) À partir des réponses ci-dessus et des recherches sur ColorStateList j’ai finalement réussi à créer une method qui définit la couleur de l’élément coché dans le tiroir de navigation pour correspondre à celle de mon thème d’application couleur générée aléatoirement au moment de l'exécution.

Voici la méthode:

public void setNavMenuItemThemeColors(int color){
    //Setting default colors for menu item Text and Icon
    int navDefaultTextColor = Color.parseColor("#202020");
    int navDefaultIconColor = Color.parseColor("#737373");

    //Defining ColorStateList for menu item Text
    ColorStateList navMenuTextList = new ColorStateList(
            new int[][]{
                    new int[]{Android.R.attr.state_checked},
                    new int[]{Android.R.attr.state_enabled},
                    new int[]{Android.R.attr.state_pressed},
                    new int[]{Android.R.attr.state_focused},
                    new int[]{Android.R.attr.state_pressed}
            },
            new int[] {
                    color,
                    navDefaultTextColor,
                    navDefaultTextColor,
                    navDefaultTextColor,
                    navDefaultTextColor
            }
    );

    //Defining ColorStateList for menu item Icon
    ColorStateList navMenuIconList = new ColorStateList(
            new int[][]{
                    new int[]{Android.R.attr.state_checked},
                    new int[]{Android.R.attr.state_enabled},
                    new int[]{Android.R.attr.state_pressed},
                    new int[]{Android.R.attr.state_focused},
                    new int[]{Android.R.attr.state_pressed}
            },
            new int[] {
                    color,
                    navDefaultIconColor,
                    navDefaultIconColor,
                    navDefaultIconColor,
                    navDefaultIconColor
            }
    );

    mNavView.setItemTextColor(navMenuTextList);
    mNavView.setItemIconTintList(navMenuIconList);
}

vous pouvez appeler cette méthode avec le int color de votre choix :)

5
Kuldeep Kumar

Commencez par vérifier la navigation ci-dessous

<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/white"
        app:itemIconTint="@drawable/drawer_item_color"
        app:itemTextColor="@drawable/drawer_item_color"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

Vérifiez ici deux choses

app:itemIconTint="@drawable/drawer_item_color"
app:itemTextColor="@drawable/drawer_item_color"

Ces deux balises utilisent drawer_item_color.xml qui est un sélecteur dans un dossier pouvant être dessiné et son code est indiqué ci-dessous.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="@color/pink" Android:state_checked="true" />
    <item Android:color="@color/black" />
</selector>

utilisez le sélecteur et ajoutez les couleurs que vous voulez. Cela fera le travail pour vous.

30
Abid Khan

Première voie

essayez d'utiliser:

app:itemIconTint="@color/color_pink"  //selected icon color
app:itemTextColor="@color/color_pink" //selected text color
app:itemBackground="@color/color_gray" 

Pour votre NavigationView

<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_drawer"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/header_layout"
app:itemIconTint="@color/color_pink"  
app:itemTextColor="@color/color_pink" 
app:itemBackground="@color/color_gray"
app:menu="@menu/menu_drawer" />

Deuxième façon

Pour programically change use:

navigationView.setItemTextColor(ColorStateList1);
navigationView.setItemIconTintList(ColorStateList2);

Définissez ColorStateList1 et ColorStateList2 comme suit:

Pour la vue de navigation Article Couleur du texte

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.BLUE,
        Color.WHITE,
        Color.WHITE
};

ColorStateList ColorStateList1 = new ColorStateList(state, color);

Pour la vue de navigation 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.BLUE,
        Color.WHITE,
        Color.WHITE
};

ColorStateList ColorStateList2 = new ColorStateList(states, colors);
9
rafsanahmad007

As-tu essayé?

mNavigationView.setItemTextColor(yourColorStateList);
1
Silva2351

J'ai testé ce code sur sdk 17 à sdk 26 Code écrit la logique après setContent (R.layou.votre_activité) Trouve la vue de navigation avec Id

 private void setupNavigationSelection(NavigationView navigationViewList) {


    /* note : warning don't use other attribute  just checked and unchecked else         wont work*/
    int[][] states = new int[][]{
            new int[]{Android.R.attr.state_checked}, // checked
            new int[]{-Android.R.attr.state_checked} // unchecked
    };
    int[] colors = new int[]{
            Color.RED
            Color.GREEN,
    };

    LayerDrawable layerDrawable = getSideBarDrawable(0x80dedede);
    StateListDrawable arrowImgStates = new StateListDrawable();
    Drawable normalDrawable = new ColorDrawable(Color.TRANSPARENT);;
    arrowImgStates.addState(new int[]{Android.R.attr.state_pressed}, normalDrawable);
    arrowImgStates.addState(new int[]{Android.R.attr.state_focused}, layerDrawable);
    arrowImgStates.addState(new int[]{Android.R.attr.state_selected}, layerDrawable);
    arrowImgStates.addState(new int[]{Android.R.attr.state_checked}, layerDrawable);
    arrowImgStates.addState(new int[]{}, normalDrawable);

    ColorStateList colorStateList = new ColorStateList(states, colors);
    navigationViewList.setItemTextColor(colorStateList);
    navigationViewList.setItemIconTintList(colorStateList);
    navigationViewList.setItemBackground(arrowImgStates);

}

public LayerDrawable getSideBarDrawable(int bgColor) {
    int iSize = CLViewUtil.dpToPx(6);
    GradientDrawable gradientDrawable = new GradientDrawable();
    gradientDrawable.setShape(GradientDrawable.RECTANGLE);
    gradientDrawable.setStroke(iSize, CLThemeUtil.getThemePrimaryColor(this));
    gradientDrawable.setColor(bgColor);
    LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{gradientDrawable});
    layerDrawable.setLayerInset(0, 0, -iSize, -iSize, -iSize);
    return layerDrawable;

}
0
sourav pandit