it-swarm.com.de

Ändern der Textfarbe eines Menüelements in der Navigationsleiste

Ich versuche, ein Nachtdesign für meine App hinzuzufügen, und ich habe fast drei Stunden damit verschwendet, Text und Symbole in meiner Navigationsleiste weiß neben dem dunklen Hintergrund anzeigen zu lassen. So versuche ich dies in onCreate() in MainActivity.Java zu tun:

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

Das boolesche nightMode ist irrelevant, weil es funktioniert. Wenn der Nachtmodus aktiviert ist (0), wird der in der Navigationsleiste ausgewählte Menüpunkt weiß. Dies geschieht jedoch nur, wenn jedes Element ausgewählt wird, was offensichtlich unpraktisch ist. Hier ist meine 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 verwende für jedes Element weiße Symbole auf einem transparenten Hintergrund, die jedoch auf dem schwarzen Hintergrund der Navigationsleiste schwarz erscheinen. Ich habe versucht, nach einer XML-Lösung zu suchen, um die Farbe des Textes zu ändern, und ich kratzen mir den Kopf, weil ich nicht weiß, warum dies ü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!

BEARBEITEN: Ich verwende keine Bibliothek von Drittanbietern, es ist die in der Support-Bibliothek bereitgestellte Navigationsansicht. 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>
72
wasimsandhu

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

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

Hier habe ich diese Antwort bekommen. Und dann gleich nach dem Zuweisen meiner Navigationsansicht:

if (nightMode == 0) {
            navigationView.setItemTextColor(csl);
            navigationView.setItemIconTintList(csl2);
        }
27
wasimsandhu
 <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" />
194
Neha Tyagi

Verwenden Sie die App: itemIconTint in Ihrer Navigationsansicht.

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

Mehr Optionen:

sie können den Gruppentitel auch ändern, indem Sie "textColorSecondary" überschreiben.

In deiner styles.xml

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

In deinem 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"/>
11

fügen Sie app: itemTextColor = "# fff" in Ihrer Navigationsansicht hinzu

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

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

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

versuchen Sie dies in der 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
            }
    ));
3
DRM

In der Zukunft, wenn jemand mit Navigation Drawer Activity (von Studio in Activity Prompt-Fenster bereitgestellt) hierher kommt

Die Antwort ist - 

Verwenden Sie dies vor 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 Sie dies in onNavigationItemSelected () in MainActivity (Sie müssen diese Funktion nicht schreiben, wenn Sie die Navigation Drawer-Aktivitä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);

Tipp - fügen Sie diesen Code vor der If else-Bedingung in onNavigationItemSelected () ein.

3
Chirag Joshi

Das funktioniert für mich. Anstelle von customTheme können Sie Ihr Thema in Stile setzen. In diesem Code können Sie auch die Schriftart und die Textgröße ändern.

    <style name="MyTheme.NavMenu" parent="CustomTheme">
            <item name="Android:textSize">16sp</item>
            <item name="Android:fontFamily">@font/ssp_semi_bold</item>
            <item name="Android:textColorPrimary">@color/yourcolor</item>
        </style>

hier ist meine Navigationsansicht

<Android.support.design.widget.NavigationView
        Android:id="@+id/navigation_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:fitsSystemWindows="true"
        app:theme="@style/MyTheme.NavMenu"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer">

        <include layout="@layout/layout_update_available"/>

    </Android.support.design.widget.NavigationView>
2
Chandan Singh

Sie können auch ein benutzerdefiniertes Design definieren, das von Ihrem Basisdesign abgeleitet wird:

<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 dem benutzerdefinierten Design auch weitere Attribute hinzufügen.

1
Vahid Amiri

Sie können dies einfach tun, indem Sie Ihr Design zu Ihrer Navigationsansicht hinzufügen.

    <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/colorPrimary"
    Android:theme="@style/AppTheme.NavigationView"
    app:headerLayout="@layout/nav_header_drawer"
    app:menu="@menu/activity_drawer_drawer"/>

in Ihrer style.xml-Datei fügen Sie dieses Design hinzu 

   <style name="AppTheme.NavigationView" >
    <item name="colorPrimary">@color/text_color_changed_onClick</item>
    <item name="Android:textColorPrimary">@color/Your_default_text_color</item>
</style>
1
Babar Shamsi

Sie können Drawables in verwenden

app: itemTextColor app: itemIconTint

dann können Sie den aktivierten und den normalen Status mithilfe einer Zeichenfunktion steuern

<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:itemHorizontalPadding="@dimen/margin_30"
            app:itemIconTint="@drawable/drawer_item_color"
            app:itemTextColor="@drawable/drawer_item_color"
            Android:theme="@style/NavigationView"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/drawer_menu">

drawer_item_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="@color/selectedColor" Android:state_checked="true" />
    <item Android:color="@color/normalColor" />
</selector>
0
MarGin
 <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" />

So legen Sie den Elementhintergrund mithilfe der App fest: 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>

Das kann helfen. Es hat für mich funktioniert 

Gehen Sie zu activity_ "Name der Navigationsaktivität" In NavigationView fügen Sie diesen Code ein

app:itemTextColor="color of your choice"
0
Dhyan V

itemIconTint, wenn Sie die Symbolfarbe ändern möchten 

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:itemTextColor="@color/colorPrimary"
            app:itemIconTint="@color/colorPrimary"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer" />
0
user3036876