2015-08-17 1 views
55

Ich versuche, ein Nachtthema für meine App hinzuzufügen, und habe fast drei Stunden vergeudet, während Text und Symbole in meiner Navigationsleiste mit der Dunkelheit weiß werden Hintergrund. Hier ist die Art, wie ich über das tun dies in onCreate() in MainActivity.java zu gehen bin versucht:Ändern der Textfarbe des Menüelements in der Navigationsleiste

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

Die nightMode boolean ist irrelevant, weil es funktioniert. Wenn der Nachtmodus aktiviert ist (0), wird der in der Navigationsleiste ausgewählte Menüeintrag weiß. Dies geschieht jedoch nur dann, wenn jedes Element ausgewählt wird, was offensichtlich unbequem ist. Hier ist mein drawer_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> 

Ich weiß Icons für jedes Element auf einen transparenten Hintergrund bin mit, aber sie zeigen sich als schwarz auf dem schwarzen Hintergrund der Navigationsleiste. Ich habe versucht, nach einer xml-Lösung zu suchen, um die Farbe des Textes zu ändern, und ich kratze mich am Kopf, weil ich nicht weiß, warum das übersehen wurde.

Kann mir jemand eine dynamische Lösung anbieten, um das zu erreichen, was ich erreichen möchte? Alle Hilfe wird geschätzt, danke!

EDIT: Ich verwende keine Drittanbieter-Bibliothek, es ist die NavigationView in der Support-Bibliothek zur Verfügung gestellt. Hier ist das XML-Layout:

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

warum gehst du nicht Ändere einfach das Aktivitätsthema von "Light" in "Dark" und umgekehrt. – Emil

+0

@Boss Mit der Art wie meine App programmiert ist, wäre es ein langwieriger Prozess. Ich habe dieses Tag/Nacht-Thema perfekt überall sonst außer meiner Navigationsschublade, so dass alles, was ich brauche, eine Lösung dafür ist. – wasimsandhu

Antwort

23

NavigationView hat eine Methode namens setItemTextColor(). Es verwendet eine .

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

Here ist, wo ich diese Antwort bekam. Und dann gleich nach meinem NavigationView zuweisen:

if (nightMode == 0) { 
      navigationView.setItemTextColor(csl); 
      navigationView.setItemIconTintList(csl2); 
     } 
+0

Hallo, gibt es eine Möglichkeit, die Farbe jeder Gruppe der Navigationsleiste individuell zu ändern? –

+0

immer noch in der Farbe grau –

+0

Wie ändert man die Gruppentextfarbe? – Ari

157
<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" /> 
+19

Damit wird die Farbe jedes Elements der Navigationsleiste auf "Ihre Farbe" eingestellt. Gibt es eine Möglichkeit, die Farbe für jede Gruppe der Schublade individuell zu ändern? –

+2

@Akeshwar, Sie können das programmatisch versuchen, jedoch würde ich das nicht empfehlen, da es gegen die Materialrichtlinien verstößt. –

+0

ja es gibt eine Möglichkeit, die Farben auch einzeln zu ändern! –

3

versuchen, dies in Java-Klasse

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 
      } 
    )); 
1

Sie können auch ein eigenes Design definieren, die von Ihrer Basis Thema abgeleitet:

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

und dann in Ihrer Datei styles.xml:

<style name="MyTheme.NavMenu" parent="MyTheme.Base"> 
    <item name="android:textColorPrimary">@color/yourcolor</item> 
    </style> 

Sie können auch weitere Attribute auf das benutzerdefinierte Design anwenden.

5

Ich habe den Code unten verwendet, um die Farbe der Navigationsleiste in meiner App zu ändern.

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
navigationView.setItemTextColor(ColorStateList.valueOf(Color.WHITE)); 
26

Verwenden App: itemIconTint in Ihrem NavigationView, ej:

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

und was für ausgewählte Artikel Textfarbe? –

4

Weitere Optionen:

Sie können auch die Gruppentitel durch zwingende ändern "textColorSecondary"

In Ihrem Stile .xml

<style name="AppTheme.NavigationView"> 
    <item name="android:textColorSecondary">#FFFFFF</item> 
</style> 

In Ihrem Layout

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

Artikel Hintergrund einstellen App: itemBackground

drawer_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

Was ist der Unterschied in Ihrer Antwort? Ich denke es ist schon beantwortet ... – karan

1

In Zukunft, wenn jemand kommt hier mit , Navigationsleiste Aktivität (von Studio in Aktivität Aufforderungsfenster zur Verfügung gestellt)

Die Antwort ist -

verwenden, bevor OnCreate() in 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); 

und verwenden diese in onNavigationItemSelected() in MainActivity (Sie müssen diese Funktion nicht schreiben, wenn Sie die Navigationsschubladenaktivität verwenden, sie wird in MainActivity hinzugefügt).

NavigationView nav = (NavigationView) findViewById(R.id.nav_view); 
    nav.setItemTextColor(csl); 
    nav.setItemIconTintList(csl2); 
    nav.setItemBackgroundResource(R.color.white); 

Tip - fügen Sie diesen Code vor Wenn sonst Zustand in onNavigationItemSelected()

0

App hinzufügen: itemTextColor = "# fff" in Ihrem NavigationView wie

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