Alttaki Navigasyon Görünümünde seçilen sekmenin rengi


142

BottomNavigationViewBir projeye ekliyorum ve seçili sekme için farklı bir metin (ve simge tonu) rengine sahip olmak istiyorum (seçili olmayan sekmeler grileşmesini sağlamak için). android:state_selected="true"Renk seçici kaynak dosyasında bulunan farklı bir renk kullanmak işe yaramıyor. Ayrıca ek öğe girişleri olan android:state_focused="true"veya android:state_enabled="true"ne yazık ki hiçbir etkisi olan çalıştı . Ayrıca state_selectedöznitelik varsayılan (seçili olmayan) renk için yanlış (açıkça), şans olmadan ayarlamaya çalıştı .

Görünümü düzenime nasıl ekleyeceğim:

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

İşte benim renk seçicim ( 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>

Ve menü kaynağım ( 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>

Herhangi bir yardım için minnettar olurum.

Yanıtlar:


310

A yaparken selector, varsayılan durumu her zaman sonunda tutun, aksi takdirde yalnızca varsayılan durum kullanılır. Seçicinizdeki öğeleri şu şekilde yeniden sıralamanız gerekir:

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

Ve devlet kullanılmak üzere BottomNavigationBarolan state_checkeddeğil state_selected.


77
<android.support.design.widget.BottomNavigationView uygulamasına ekleyin: itemIconTint = "@ drawable / nav_item_color_state" uygulaması: itemTextColor = "@ drawable / nav_item_color_state" />
dianakarenms

1
Benim durumumda dinamik menü oluşturmam gerekiyordu ve bu çözüm işe yaramadı. Tek çalışma çözümü menü öğelerini manuel olarak ayarlamaktı stackoverflow.com/a/7106111/2098878
Rafael

9
"state_checked, state_selected değil". Ne zaman tasarrufu :) Teşekkürler!
Piotr Ślesarew

3
üzerine ekleyin <android.support.design.widget.BottomNavigationView uygulaması: itemIconTint = app "renkli / nav_item_color_state @": itemTextColor = / "renkli / nav_item_color_state @"> yerine @ çekilebilir arasında
Anton Makov

1
Benim gibi takılı kalan herkes için, "res" de bir "renk" dizini oluşturmak ve bu dosyayı oraya koymak zorunda kaldım.
Tayyab Mazhar

67

1. Inside res adı renk ile klasör oluşturmak (çizilebilir gibi)

2. Renk klasörünü sağ tıklayın. Seç yeni-> renk kaynak file-> color.xml dosyası oluşturmak (bnv_tab_item_foreground) (Şekil 1: Dosya Yapısı)

3. bnv_tab_item_foreground dosyasını kopyalayıp yapıştırın

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

Şekil 1: Dosya Yapısı:

Şekil 1: Dosya Yapısı


53

BottomNavigationViewkullanan colorPrimary seçilen sekme için uygulanan temasından ve kullandığı android:textColorSecondary inaktif sekme simgesi renk tonu için.

Böylece, tercih edilen birincil renkle bir stil oluşturabilir ve bunu BottomNavigationViewbir xml düzen dosyasında temanız olarak ayarlayabilirsiniz .

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>

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

3
android:textColorSecondaryişe yaramaz. android:colorForegroundyerine kullanmalı
Mehdi Moqadasi

Bu en iyi yanıttır, "selector" yöntemi, orijinal olandan farklı olan etkin olmayan sekme rengi olarak "darker_gray" kullanır. android:textColorSecondaryBenim için de çalışıyor. Teşekkürler!
Sam Chen

9

Simgeleri ve metinlerin renklerini programlı olarak değiştirmek istiyorsanız:

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

5

Cevap vermek için çok geç ama birileri için yararlı olabilir. Çok aptalca bir hata yapıyordum, renk değişikliği ve seçimini kaldırmak için bottom_color_nav.xml adlı bir seçici dosya kullanıyordum ama yine de BottomNavigationView'daki herhangi bir renk değişikliğini yansıtmıyordu.

Sonra, fark ben dönüyordu false içinde onNavigationItemSelected yöntemiyle. Bu yöntemde true değerini döndürürseniz iyi çalışır.


2

Seçici öğe nitelikleri android:state_enabledyerine kullanmayı deneyin android:state_selected.


Soruda belirtildiği gibi, state_enabled'ı da denedim, ancak bu belirli widget ile kullanılacak doğru durum özelliği değil. Sorun yanıtta belirtilmişti: 1. Sıralama yanlıştı (varsayılan durum seçicideki son öğe olmalıdır) 2. state_checked, BottomNavigationView ile kullanılacak doğru durum özelliğidir.
Javad Sadeqzadeh

2

Ben kullanıyorum com.google.android.material.bottomnavigation.BottomNavigationView(OP adlı aynı değildir) ve yukarıda önerilen çözümlerin çeşitli çalıştı, ancak çalıştığı tek şey batıyordu app:itemBackgroundve app:itemIconTintbenim seçici renk benim için çalıştı için.

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

Benim color/tab_color.xmlkullanımlarıandroid: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>

ve aynı zamanda color/bottom_navigation_text_color.xml

resim açıklamasını buraya girin

Burada tamamen ilgili değil, tam şeffaflık için BottomNavigationViewtarzım aşağıdaki gibidir:

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

1

TextColor'ı ayarlamak için, doğrudan xml'den ayarlayabileceğiniz BottomNavigationViewiki stil özelliği vardır :

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

0

Bu çalışacak:

setItemBackgroundResource(android.R.color.holo_red_light)

0

Seçici oluşturmak yerine, bir stil oluşturmanın en iyi yolu.

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

ve seçili olan veya olmayan metin boyutunu değiştirmek için.

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

Android'in tadını çıkarın!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.