web-dev-qa-db-fra.com

Change Navigation View Item Color Dynamically Android

J'aimerais créer un tiroir de navigation dans lequel chaque élément a une couleur de sélection différente (la teinte de l'icône et la couleur du texte), comme dans Google Play Store:

enter image description here

Je ne sais pas comment ils ont résolu ce problème, je pense qu'ils utilisent différentes activités avec différents tiroirs. Je souhaite utiliser des fragments et modifier la teinte de l'icône et la couleur du texte. Des idées comment je peux faire ceci? J'utilise la bibliothèque de support de conception de Google et une disposition de tiroir avec une vue de navigation à l'intérieur.

15
vigonotion

utilisez app:itemIconTint dans votre NavigationView pour les icônes et utilisez app:itemTextColor pour textColors

Échantillon :

drawable/navigation_text_color:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <!-- This is used when the Navigation Item is checked -->
    <item Android:color="#009688" Android:state_checked="true" />
    <!-- This is the default text color -->
    <item Android:color="#E91E63" />
</selector>

et layout:

<Android.support.design.widget.NavigationView
       .
       .
       app:itemTextColor="@drawable/navigation_text_color"/>
36
DJafari

Si vous voulez dire dynamiquement par programmation, vous pouvez essayer ceci:

// FOR NAVIGATION VIEW ITEM TEXT COLOR
int[][] states = new int[][]{
        new int[]{-Android.R.attr.state_checked},  // unchecked
        new int[]{Android.R.attr.state_checked},   // checked
        new int[]{}                                // default
};

// Fill in color corresponding to state defined in state
int[] colors = new int[]{
        Color.parseColor("#747474"),
        Color.parseColor("#007f42"),
        Color.parseColor("#747474"),
};

ColorStateList navigationViewColorStateList = new ColorStateList(states, colors);

// apply to text color
navigationView.setItemTextColor(navigationViewColorStateList);

// apply to icon color
navigationView.setItemIconTintList(navigationViewColorStateList);

Vous pouvez donc définir plusieurs couleurs pour différents paramètres, tels que Jour ou Nuit.

5
Robert
    <Android.support.design.widget.NavigationView
           .
           .
           app:itemIconTint="@color/your_selector_file_name" // for Icon
        app:itemTextColor="@color/your_selector_file_name" // for text
/>

Ajoutant à ce que @DAVOOD a dit. Le sélecteur de couleur ci-dessous a fonctionné pour moi.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <!-- This is used when the Navigation Item is checked -->
        <item Android:color="@color/tenoBrandColor" Android:state_pressed="true" />
        <!-- This is the default text color -->
        <item Android:color="@color/textprimary" />
</selector>
0
Sagar Devanga

Il existe une option plus simple pour les plus paresseux.

TL; DR: Créez simplement une nouvelle style avec la colorPrimary correspondant à la couleur souhaitée, puis définissez la NavigationView's theme sur cette nouvelle style.

Il suffit de créer une nouvelle style comme:

<style name="AppTheme.NoActionBar.NavigationView">
    <item name="colorPrimary">@color/myDesiredColor</item>
</style>

Cette style héritera automatiquement de votre theme de base (dans mon cas, c'était AppTheme.NoActionBar) et il vous suffira ensuite de définir la colorPrimary avec votre couleur désirée.

Ensuite, il vous suffit de définir la variable NavigationView 's theme comme suit:

Android:theme="@style/AppTheme.NoActionBar.NavigationView"

dans:

<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:headerLayout="@layout/nav_header_menu_test"
    app:menu="@menu/main_drawer"
    Android:theme="@style/AppTheme.NoActionBar.NavigationView" /> 
0
mFeinstein

Enfin j'ai eu la réponse,

Vous devez modifier colorAccent dans le fichier de couleurs, quelle que soit la couleur souhaitée: 

  <color name="colorAccent">whichever color required</color>

Cette solution a fonctionné pour moi

0
Parth Anjaria