无法在导航抽屉中更改所选项目的背景颜色

时间:2016-09-07 06:37:32

标签: android navigation-drawer android-navigation-drawer

我想为导航抽屉上的所选项目设置不同的颜色,这里是我的代码

 <android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="@dimen/navigation_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer"
    app:itemIconTint="@drawable/drawer_list_selector"
    app:itemBackground="@drawable/drawer_list_selector"
    app:itemTextColor="@drawable/nav_item_text"
    />

drawer_list_lesector.xml

 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/light_pink_color" />
    <item android:state_selected="true" android:drawable="@drawable/light_pink_color"/>
    <item android:state_checked="true" android:drawable="@drawable/light_pink_color"/>
    <item android:state_focused="true"  android:drawable="@drawable/light_pink_color"/>
    <item android:state_active="true"  android:drawable="@drawable/light_pink_color"/>
    <item android:drawable="@android:color/transparent" />
 </selector> 

light_grey_color.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#F1F1F1"/>
</shape>

light_pink_color.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#F1E1F1"/>
</shape>

nav_item_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_checked="true" />
    <item android:color="#BBBBBB" />
</selector>

但它仍然没有改变所选项目的颜色

3 个答案:

答案 0 :(得分:0)

请参阅Sash_KP Answer

您可以使用Color State Resource实现此目的。如果您在NavigationView内部注意到您正在使用

app:itemIconTint="@color/black"
app:itemTextColor="@color/primary_text"

此处不使用@color/black@color/primary_test,而是使用Color State List Resource。为此,首先在xml目录中创建一个新的color(例如drawer_item.xml)(它应该在res目录中。)如果你没有名为{的目录{1}}已经创建了一个。

现在color内部做了类似的事情

drawer_item.xml

最后一步是更改<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="checked state color" android:state_checked="true" /> <item android:color="your default color" /> </selector>

NavigationView

像这样,您可以为<android.support.design.widget.NavigationView android:id="@+id/activity_main_navigationview" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/drawer_header" app:itemIconTint="@color/drawer_item" // notice here app:itemTextColor="@color/drawer_item" // and here app:itemBackground="@color/drawer_item"// and here for changing the background color of the item which is checked app:menu="@menu/menu_drawer"> IconTintItemTextColor使用单独的颜色状态列表资源。

现在,当您将项目设置为已选中时(在ItemBackground或以编程方式设置),特定项目的颜色将与未选中项目的颜色不同。

According to your work

答案 1 :(得分:0)

变化:

app:itemBackground="@drawable/drawer_list_selector"

为:

app:itemBackground="@color/drawer_list_selector"

将文件drawer_list_selector.xml/drawable/文件夹移动到/color/文件夹(如果不存在则创建一个)。 现在,将drawer_list_selector更改为颜色的选择器:

<?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#F1E1F1" />
    <item android:state_selected="true" android:color="#F1E1F1"/>
    <item android:state_checked="true" android:color="#F1E1F1"/>
    <item android:state_focused="true" android:color="#F1E1F1"/>
    <item android:state_active="true" android:color="#F1E1F1"/>
    <item android:color="@android:color/transparent" />
 </selector> 

答案 2 :(得分:0)

我最近遇到了同样的问题,并最终找到了答案。

在菜单定义文件@menu/activity_main_drawer中,您需要向要检查的每个项目添加android:checkable="true",否则itemBackground将不会显示选中状态。

不要问我为什么itemIconTintitemTextColor可以在没有此功能的情况下正常工作,但是itemBackground需要它,对我来说也没有道理。