如何为设计支持库中的NavigationView设置样式?

30

所以我正在使用由Android Design Support Library提供的NavigationView

enter image description here

我似乎找不到如何样式化它的示例。

目前为止,我已经做了:

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:layout_gravity="start"
    app:headerLayout="@layout/header"
    app:menu="@menu/drawer"
    app:itemTextColor="@color/black"
    app:itemIconTint="@color/black"/>
在自己的XML布局下,对标题进行样式设置很容易,但正文是一个菜单资源文件而不是一个布局。以下是一些属性可用于更改菜单项的颜色和背景:
  • app:itemTextColor 可以更改文字颜色
  • app:itemIconTint 可以更改图标颜色
  • app:itemBackground 可以更改项目背景颜色
因此,如何设置所选项目的背景、文字颜色和图标颜色呢?
2个回答

45

我曾经回答过一个类似的问题 这里.

基本上你需要做的是使用 Color State List Resource。为此,首先创建一个新的 xml 文件(例如 drawer_item.xml),并将其放置在 res 目录下的 color 子目录中。如果你还没有名为 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>

对于itemBackground,需要在drawable文件夹中放置一个单独的可绘制对象。名称相同为drawer_item。对于itemBackground,应设置android:drawable属性而不是android:color属性:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
       android:drawable="@drawable/shape_rectangle_checked"

        android:state_checked= "true" />
    <item android:drawable="@drawable/shape_rectangle" />

</selector>

文件shape_rectangle

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
<solid android:color="#ffffff" /> <!--white color -->
</shape>

文件shape_rectangle_checked

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
<solid android:color="#25aaf1" /> <!--blue color -->
</shape>

然后像这样在你的navigationview中设置

app:itemIconTint="@color/drawer_item" //notice here
app:itemTextColor="@color/drawer_item" //and here
app:itemBackground="@drawable/drawer_item"//and here for changing the background color of the item which is checked

1
我把XML文件放在res/color目录下,但是它显示“Resources$NotFoundException: File res/color/drawer_menu_item.xml from drawable resource”。 - Frozen Crayon
1
将可绘制对象添加到strings.xml文件中...这可能是让自己在文件中迷失的最佳方式 :) - geecko
@geecko:同意。然而在这种情况下,原始解决方案通常不适用于OP。因此我建议另一种方式或甚至另一种方式(在给定的链接中)。 - Sash_KP
1
这会影响涟漪效果的颜色吗? - android developer
1
ah app:itemBackground 应该是一个可绘制对象。 - Lubos Mudrak
显示剩余7条评论

3
为了补充@Sash_KP的答案,在drawable文件夹中的xml中,您不需要使用@drawable/shape_rectangle和@drawable/shape_rectangle_check。 您可以使用@color/your_color。
另外,对于API>= 21,我注意到导航菜单项默认具有预设选择器。 如果您触摸并按住菜单项,将出现涟漪效果。 使用自定义itemBackground将无法覆盖默认涟漪效果。 因此,如果您使用ripple drawable,它将创建两个涟漪效果! 此外,带有ripple drawable的菜单项出于某种原因不允许您具有按下状态(仅在HOLD下才会出现默认涟漪效果)。
因此,对于API>= 21,我不建议使用ripple drawable。 只需使用没有自定义涟漪效果的常规selector drawable即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接