BottomNavigationView中的背景颜色更改

Rav*_*avi 25 android bottomnavigationview

我已经实现BottomNavigationView了新支持库25.0.0中提供的功能.这是我的代码

<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/colorPrimary"
    app:itemIconTint="@drawable/text"
    app:itemTextColor="@drawable/text"
    app:menu="@menu/bottom_navigation_main" />
Run Code Online (Sandbox Code Playgroud)

并且text.xml可绘制

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_enabled="true" />
    <item android:color="@color/colorPrimaryDark" android:state_enabled="false" />
</selector>
Run Code Online (Sandbox Code Playgroud)

使用此代码,我可以在单击菜单项时更改文本颜色,但是当我对其应用相同的app:itemBackground内容时显示错误<item> tag requires a 'drawable' attribute or child tag defining a drawable.

这就是我的尝试 app:itemBackground

app:itemBackground="@drawable/text"
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何更改所选菜单项的背景颜色?

Rav*_*avi 36

从这个中等职位找到答案

  1. 我们需要使用android:state_checked而不是android:state_enabled
  2. onNavigationItemSelected你内部需要使用return true而不是return false.

并设置背景下,我们不能使用android:color<item>,我们需要使用android:drawable

所以在这里它的外观XML文件,当你设置它app:itemTextColorapp:itemIconTint

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorPrimaryDark" android:state_checked="true" />
    <item android:color="@android:color/white" android:state_checked="false" />
</selector>
Run Code Online (Sandbox Code Playgroud)

并设置app:itemBackground选择器

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/banner_white" android:state_checked="true"/>
    <item android:drawable="@drawable/banner_green" android:state_checked="false"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

这里banner_whitebanner_greenpngs.

  • 如果您可以在此处添加更新的视图xmls将会很棒 (2认同)
  • 您实际上可以使用颜色资源而不是可绘制资源,但是使用 `android:drawable` 属性,就像这样 `android:drawable="@color/colorPrimary"` (2认同)

Unl*_*nja 14

我遇到了类似OP的问题,但有点不同.如果你把它@color/color_selector放入BottomNavigationView中app:itemBackground="___".它会导致视图隐藏在设计面板中,并且应用程序在启动时会被粉碎.虽然它只是将它设置为恒定的颜色,但工作正常@color/black.

为了更深入的解释,我挖到了android api参考.现在我想我找到了可以合理解决这个问题的答案.(可能不准确.)

问题是,你提供的并不完全是他们所要求的.

app:itemIconTintapp:itemTextColor要求一个十六进制颜色,同时app:itemBackground要求一个字面上的Drawable.<color>我们写的元素colors.xmlColorDrawable.它源自Drawable,因此它可以提供所有三个属性.

但是,当您将其更改为使用选择器时,情况会有所不同.hex color和drawable都有相应的选择器.选择器的作用类似于您输入的资源,但结果不是原始的.它更像是一个单一用途的包装器.您不能将十六进制颜色提供给需要Drawable的属性.

颜色选择器实际上是一个ColorStateList,提供一个十六进制颜色,驻留在res/color.您只能使用android:color此文件中的属性.如果你写,它会提示错误android:drawable.
drawable选择器是StateListDrawable,提供Drawable,驻留在res/drawable.你应该写android:drawable在这里,但如果你写的话没有错误android:color.

但是android:color只提供一个无法识别为Drawable的十六进制颜色,同时app:itemBackground需要一个Drawable,因此该应用程序注定失败.(直接原因)

属性(android:colorandroid:drawable)都接受ColorDrawable,这里它就像设置常量颜色一样.

解决方案(和实践)是:

  • 在(和)android:drawable中使用res/drawable/drawable_selector.xml.例:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@color/colorAccent" android:state_checked="true" />
        <item android:drawable="@color/colorAccentDark" />
    </selector>
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用res/color/color_selector.xml时,它需要一个十六进制颜色(避免混淆).例:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:color="@android:color/white" android:state_checked="true"/>
        <item android:color="@color/colorPrimary" />
    </selector>
    
    Run Code Online (Sandbox Code Playgroud)
  • 提供app:itemBackgrounddrawable.例:

    <android.support.design.widget.BottomNavigationView
        ...
        app:itemBackground="@drawable/drawable_selector"
        app:itemIconTint="@color/color_selector"
        app:itemTextColor="@color/color_selector"
        ... />
    
    Run Code Online (Sandbox Code Playgroud)

(值得注意的是,如果您使用的是Android Studio,其自动完成功能会告诉您哪些属性合法且可用,并且它不会建议您android:color使用选择器res/drawable!)