底部导航视图中选定的选项卡颜色

时间:2016-10-30 02:00:59

标签: android material-design navigationbar

我正在为项目添加BottomNavigationView,并且我希望为所选标签设置不同的文本(和图标色调)颜色(以实现灰色非选定标签效果)。在颜色选择器资源文件中使用android:state_selected="true"的不同颜色似乎不起作用。我还尝试使用android:state_focused="true"android:state_enabled="true"添加其他项目条目,但遗憾的是没有效果。还尝试将state_selected属性设置为false(显式)为默认(未选中)颜色,没有运气。

以下是我将视图添加到布局的方法:

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

这是我的颜色选择器(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>

我的菜单资源(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>

我将不胜感激。

10 个答案:

答案 0 :(得分:242)

在创建selector时,始终保持默认状态,否则仅使用默认状态。您需要将选择器中的项目重新排序为:

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

BottomNavigationBar一起使用的状态为state_checked而不是state_selected

答案 1 :(得分:27)

1. res 内创建名称颜色的文件夹(如drawable)

2. :右键单击颜色文件夹。选择 新建 - &GT;色彩资源文件 - &gt;创建color.xml文件(bnv_tab_item_foreground) (图1:文件结构)

3. 复制并粘贴bnv_tab_item_foreground

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

图1:文件结构:

Figure 1: File Structure

答案 2 :(得分:15)

BottomNavigationView使用应用于所选标签的主题中的 colorPrimary ,并将其uses android:textColorSecondary用于不活动的标签图标色调。

因此,您可以创建具有首选原色的样式,并将其设置为xml布局文件中BottomNavigationView的主题。

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

答案 3 :(得分:5)

我正在使用com.google.android.material.bottomnavigation.BottomNavigationView(与OP的不同),并且尝试了上面建议的各种解决方案,但是唯一有效的方法是将app:itemBackgroundapp:itemIconTint设置为我的选择器颜色对我有用。

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

我的color/tab_color.xml使用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>

而且我还在为color/bottom_navigation_text_color.xml

使用选定的状态颜色

enter image description here

这里并不完全相关,但是为了完全透明,我的BottomNavigationView样式如下:

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

答案 4 :(得分:1)

为了设置textColor,BottomNavigationView具有两个 style属性,您可以直接从xml中进行设置:

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

答案 5 :(得分:0)

尝试使用android:state_enabled而不是android:state_selected作为选择器项属性。

答案 6 :(得分:0)

如果要以编程方式更改图标和文本的颜色:

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

答案 7 :(得分:0)

这将起作用:

setItemBackgroundResource(android.R.color.holo_red_light)

答案 8 :(得分:0)

为时已晚,但对任何人都有帮助。 我犯了一个非常愚蠢的错误,我使用 bottom_color_nav.xml 进行选择和取消选择颜色更改。在BottomNavigation中仍然无法获得正确的颜色。

然后我意识到,在仅随我的代码发布的 onNavigationItemSelected 方法中,我返回了false。

答案 9 :(得分:0)

与其创建选择器, 创建样式的最佳方法。

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

并更改文本大小(已选中或未选中)。

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