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 :
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:
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>
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 :)
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.
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);
As-tu essayé?
mNavigationView.setItemTextColor(yourColorStateList);
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;
}