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

How to style the Design Support library's NavigationView?

所以我正在使用 Android Design Support Library

提供的 NavigationView

我似乎找不到有关如何设置样式的示例。

到目前为止我有:

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

header 的样式很容易,因为它在自己的 xml 布局下,但 body 是菜单资源文件,而不是布局。

那么怎么设置

我已经回答了类似的问题

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

然后像这样在导航视图中设置

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

为了扩展@Sash_KP 的答案,对于 drawable 文件夹中的 xml,您不需要 @drawable/shape_rectangle@drawable/shape_rectangle_check。你可以只使用 @color/your_color.

还有 API >= 21,我注意到默认情况下导航菜单项有一个预设选择器。您会注意到,如果您触摸并按住菜单项,就会出现波纹。使用自定义 itemBackground 不会覆盖默认波纹。因此,如果您使用 ripple drawable,它将产生两个涟漪!此外,带有 ripple drawables 的菜单项由于某种原因不允许您处于按下状态(默认波纹只有在您按住时才会出现)。

所以对于 API >= 21,我不建议使用 ripple drawable。只需使用没有自定义波纹的常规 selector drawable