Die Farbe der ausgewählten Registerkarte in der unteren Navigationsansicht

142

Ich füge BottomNavigationVieweinem Projekt ein hinzu und möchte eine andere Textfarbe (und Symbolfarbe) für die ausgewählte Registerkarte haben (um den Effekt nicht ausgewählter Registerkarten auszublenden). Die Verwendung einer anderen Farbe android:state_selected="true"in einer Ressourcendatei für die Farbauswahl scheint nicht zu funktionieren. Ich habe auch versucht, zusätzliche Artikeleinträge mit android:state_focused="true"oder android:state_enabled="true"leider ohne Wirkung zu haben. Es wurde auch versucht, das state_selectedAttribut für die Standardfarbe (nicht ausgewählt) auf false (explizit) zu setzen, ohne Erfolg.

So füge ich die Ansicht meinem Layout hinzu:

<android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:itemBackground="@color/silver"
        app:itemIconTint="@color/bnv_tab_item_foreground"
        app:itemTextColor="@color/bnv_tab_item_foreground"
        app:menu="@menu/bottom_nav_bar_menu" />

Hier ist mein Farbwähler ( bnv_tab_item_foreground.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/darker_gray"  />
    <item android:state_selected="true" android:color="@android:color/holo_blue_dark" />
</selector>

Und meine Menüquelle ( bottom_nav_bar_menu.xml):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/action_home"
        android:icon="@drawable/ic_local_taxi_black_24dp"
        android:title="@string/home" />
    <item
        android:id="@+id/action_rides"
        android:icon="@drawable/ic_local_airport_black_24dp"
        android:title="@string/rides"/>
    <item
        android:id="@+id/action_cafes"
        android:icon="@drawable/ic_local_cafe_black_24dp"
        android:title="@string/cafes"/>
    <item
        android:id="@+id/action_hotels"
        android:icon="@drawable/ic_local_hotel_black_24dp"
        android:title="@string/hotels"/>

</menu>

Ich würde mich über jede Hilfe freuen.

Javad Sadeqzadeh
quelle

Antworten:

309

Behalten Sie beim Erstellen von a selectorimmer den Standardstatus am Ende bei, da sonst nur der Standardstatus verwendet wird. Sie müssen die Elemente in Ihrer Auswahl wie folgt neu anordnen:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="@android:color/holo_blue_dark" />
    <item android:color="@android:color/darker_gray"  />
</selector>

Und der Staat, mit dem man arbeiten soll, BottomNavigationBarist es state_checkednicht state_selected.

Kamran Ahmed
quelle
77
Fügen Sie es auf <android.support.design.widget.BottomNavigationView App hinzu: itemIconTint = "@ drawable / nav_item_color_state" App: itemTextColor = "@ drawable / nav_item_color_state" />
dianakarenms
1
In meinem Fall musste ich ein dynamisches Menü generieren, und diese Lösung funktionierte nicht. Die einzige funktionierende Lösung war das manuelle Einstellen der Menüelemente stackoverflow.com/a/7106111/2098878
Rafael
9
"state_checked not state_selected". Was für eine Zeitersparnis :) Danke!
Piotr Ślesarew
3
Fügen Sie es auf <android.support.design.widget.BottomNavigationView App hinzu: itemIconTint = "@ color / nav_item_color_state" App: itemTextColor = "@ color / nav_item_color_state" /> anstelle von @ drawable
Anton Makov
1
Für alle, die wie ich stecken blieben, musste ich in "res" ein "Farb" -Verzeichnis erstellen und diese Datei dort ablegen.
Tayyab Mazhar
66

1. In res Ordner mit Namensfarbe erstellen (wie zeichnbar)

2. Klicken Sie mit der rechten Maustaste auf den Farbordner. Wählen Sie new-> color resource file-> create color.xml file (bnv_tab_item_foreground) (Abbildung 1: Dateistruktur )

3. Kopieren Sie bnv_tab_item_foreground und fügen Sie es ein

<android.support.design.widget.BottomNavigationView
            android:id="@+id/navigation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="0dp"
            android:layout_marginStart="0dp"
            app:itemBackground="@color/appcolor"//diffrent color
            app:itemIconTint="@color/bnv_tab_item_foreground" //inside folder 2 diff colors
            app:itemTextColor="@color/bnv_tab_item_foreground"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:menu="@menu/navigation" />

bnv_tab_item_foreground:

 <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true" android:color="@color/white" />
        <item android:color="@android:color/darker_gray"  />
    </selector>

Abbildung 1: Dateistruktur:

Abbildung 1: Dateistruktur

Kishore Reddy
quelle
52

BottomNavigationViewVerwendet colorPrimary aus dem Thema, das für die ausgewählte Registerkarte angewendet wurde, und verwendet es android:textColorSecondary für den Farbton des inaktiven Registerkartensymbols.

So können Sie einen Stil mit der bevorzugten Primärfarbe erstellen und ihn als Thema BottomNavigationViewin einer XML-Layoutdatei festlegen .

styles.xml :

 <style name="BottomNavigationTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/active_tab_color</item>
        <item name="android:textColorSecondary">@color/inactive_tab_color</item>
 </style>

your_layout.xml :

<android.support.design.widget.BottomNavigationView
            android:id="@+id/navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?android:attr/windowBackground"
            android:theme="@style/BottomNavigationTheme"
            app:menu="@menu/navigation" />
dzikovskyy
quelle
3
android:textColorSecondaryfunktioniert nicht. sollte android:colorForegroundstattdessen verwenden
Mahdi Moqadasi
Dies ist die beste Antwort. Die "Selector" -Methode verwendet "darker_gray" als inaktive Tabulatorfarbe, die sich von der ursprünglichen unterscheidet. Funktioniert auch android:textColorSecondarybei mir. Vielen Dank!
Sam Chen
8

Wenn Sie die Farben von Symbolen und Texten programmgesteuert ändern möchten:

ColorStateList iconsColorStates = new ColorStateList(
            new int[][]{
                    new int[]{-android.R.attr.state_checked},
                    new int[]{android.R.attr.state_checked}
            },
            new int[]{
                    Color.parseColor("#123456"),
                    Color.parseColor("#654321")
            });

    ColorStateList textColorStates = new ColorStateList(
            new int[][]{
                    new int[]{-android.R.attr.state_checked},
                    new int[]{android.R.attr.state_checked}
            },
            new int[]{
                    Color.parseColor("#123456"),
                    Color.parseColor("#654321")
            });

    navigation.setItemIconTintList(iconsColorStates);
    navigation.setItemTextColor(textColorStates);
Max Zonov
quelle
5

Es ist zu spät, um zu antworten, könnte aber für jemanden hilfreich sein. Ich habe einen sehr dummen Fehler gemacht. Ich habe eine Auswahldatei mit dem Namen bottom_color_nav.xml zum Auswählen und Deaktivieren der Farbänderung verwendet, die jedoch keine Farbänderung in BottomNavigationView widerspiegelte.

Dann stelle ich fest, dass ich in der onNavigationItemSelected- Methode false zurückgegeben habe . Es wird gut funktionieren, wenn Sie bei dieser Methode true zurückgeben.

Ajay Singh
quelle
2

Versuchen Sie es mit , android:state_enabledanstatt android:state_selectedfür die Wähler Artikel Attribute.

Abtin Gramian
quelle
Wie in der Frage erwähnt, habe ich auch state_enabled ausprobiert, aber das ist nicht das richtige Statusattribut, das mit diesem bestimmten Widget verwendet werden soll. Das Problem war das, was in der Antwort erwähnt wurde: 1. Die Reihenfolge war falsch (Standardstatus sollte das letzte Element in der Auswahl sein) 2. state_checked ist das richtige Statusattribut, das mit BottomNavigationView verwendet werden soll.
Javad Sadeqzadeh
1

Um Satz Textfarbe, BottomNavigationViewhat zwei Stileigenschaften direkt aus der XML festlegen können:

  • itemTextAppearanceActive
  • itemTextAppearanceInactive
In your layout.xml file:

<com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bnvMainNavigation"
            style="@style/NavigationView"/>

In your styles.xml file:

<style name="NavigationView" parent="Widget.MaterialComponents.BottomNavigationView">
  <item name="itemTextAppearanceActive">@style/ActiveText</item>
  <item name="itemTextAppearanceInactive">@style/InactiveText</item>
</style>
<style name="ActiveText">
  <item name="android:textColor">@color/colorPrimary</item>
</style>
<style name="InactiveText">
  <item name="android:textColor">@color/colorBaseBlack</item>
</style>
Nicola Gallazzi
quelle
1

Ich verwende ein com.google.android.material.bottomnavigation.BottomNavigationView(nicht dasselbe wie OPs) und habe verschiedene der oben vorgeschlagenen Lösungen ausprobiert, aber das einzige, was funktioniert hat, war das Einstellen app:itemBackgroundund die Auswahl app:itemIconTintmeiner Auswahlfarbe für mich.

        <com.google.android.material.bottomnavigation.BottomNavigationView
            style="@style/BottomNavigationView"
            android:foreground="?attr/selectableItemBackground"
            android:theme="@style/BottomNavigationView"
            app:itemBackground="@color/tab_color"
            app:itemIconTint="@color/tab_color"
            app:itemTextColor="@color/bottom_navigation_text_color"
            app:labelVisibilityMode="labeled"
            app:menu="@menu/bottom_navigation" />

Meine color/tab_color.xmlVerwendungandroid:state_checked

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/grassSelected" android:state_checked="true" />
    <item android:color="@color/grassBackground" />
</selector>

und ich verwende auch eine ausgewählte Zustandsfarbe für color/bottom_navigation_text_color.xml

Geben Sie hier die Bildbeschreibung ein

Hier nicht ganz relevant, aber für volle Transparenz ist mein BottomNavigationViewStil wie folgt:

    <style name="BottomNavigationView" parent="Widget.Design.BottomNavigationView">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">@dimen/bottom_navigation_height</item>
        <item name="android:layout_gravity">bottom</item>
        <item name="android:textSize">@dimen/bottom_navigation_text_size</item>
    </style>
Sampson
quelle
0

Das wird funktionieren:

setItemBackgroundResource(android.R.color.holo_red_light)
KUNAL DAS
quelle
0

Anstatt einen Selektor zu erstellen, ist dies der beste Weg, um einen Stil zu erstellen.

<style name="AppTheme.BottomBar">
    <item name="colorPrimary">@color/colorAccent</item> 
</style>

und um die ausgewählte oder nicht ausgewählte Textgröße zu ändern.

<dimen name="design_bottom_navigation_text_size" tools:override="true">11sp</dimen>
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">12sp</dimen>

Viel Spaß mit Android!

Shahbaz Ahmed
quelle