2015-06-21 11 views
13

Mi piacerebbe costruire un cassetto di navigazione in cui ogni elemento ha un diverso colore di selezione (l'icona di tonalità e colore del testo), come Google Play Store ha:Cambio di navigazione Visualizza Articolo Colore dinamicamente Android

enter image description here

Non sono sicuro di come hanno risolto questo problema, penso che utilizzino diverse attività con diversi cassetti. Voglio usare i frammenti e voglio cambiare la tinta dell'icona e il colore del testo. Qualche idea su come posso farlo? Sto usando la libreria di supporto per la progettazione di google e un layout dei cassetti con una vista di navigazione.

+1

E' possibile che non usavano il NavigationView, dal momento che questo è stato nel modo applicazione prima la libreria di supporto alla progettazione (se ricordo correttamente). Penso che tu abbia ricreato te stesso la vista per ottenere questo effetto. – Longi

+0

@tom. hai trovato una soluzione, sembra che tu abbia accettato la risposta ma non funziona per me. –

risposta

33

uso app:itemIconTint in NavigationView per le icone e l'uso app:itemTextColor per textColors

Esempio:

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> 

e layout:

<android.support.design.widget.NavigationView 
     . 
     . 
     app:itemTextColor="@drawable/navigation_text_color"/> 
+0

grazie, sto modificando ColorStateList ogni volta che si fa clic su una voce di menu. –

+0

Dove metteresti questo selettore di snippet XML? Inoltre, 'app: itemTextColor' cambia il colore di tutte le icone. C'è un modo per cambiare il colore di una sola icona? Grazie! – justinrixx

+1

@justinrixx Lo cambio ogni volta che un elemento viene selezionato con il seguente codice java: https://jsfiddle.net/a2j7jayo/ –

0

Finllay ho avuto la risposta,

È necessario modificare il colorAccent nei colori file a cui mai colore che si desidera:

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

Questa soluzione ha funzionato per me

5

Se per dinamicamente intendi programmaticamente si può provare questo:

// 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); 

Quindi è possibile definire più colori per diverse impostazioni l Ike Day o Night.

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

In aggiunta a ciò che @DAVOOD ha detto. Il selettore sotto il colore ha funzionato per me.

<?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

C'è un'opzione più semplice per i più pigri.

TL; DR: basta creare una nuova style con la colorPrimary essendo il colore desiderato e quindi impostare s' theme il NavigationView di essere questo nuovo style.

Basta fare un nuovo style come:

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

Questo style erediterà automaticamente dalla vostra base theme (sul mio caso era AppTheme.NoActionBar) e poi basta impostare la colorPrimary con il colore desiderato.

Poi basta impostare s' theme come NavigationView:

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

in:

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