具有选定背景颜色的导航抽屉项目分隔符

Navigation Drawer item divider with selected background color

我的 android 应用程序中有一个导航抽屉。这是代码:

<com.google.android.material.navigation.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="right"
    android:fitsSystemWindows="true"
    android:background="@color/white"
    app:headerLayout="@layout/nav_header"
    app:menu="@menu/drawer_menu"
    app:itemTextColor="@color/drawer_item"
    app:itemIconTint="@color/drawer_item"
    app:itemBackground="@drawable/nav_divider"/>

我已经使用了这个 的一个答案来在项目之间添加分隔线。这是我在 NavigationView:

中用作 itemBackgroundnav_divider 可绘制对象
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:left="@dimen/activity_horizontal_margin">
        <shape android:shape="rectangle">
            <solid android:color="@color/light_gray"/>
        </shape>
    </item>
    <item android:bottom="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>
</layer-list>

现在,问题是如何更改所选项目的背景颜色。我知道在没有分隔线的情况下如何做到这一点,但是有了分隔线,它就更复杂了。

更新:

这是我尝试过的方法:

我创建了另一个名为 nav_divider_selected 的可绘制对象,除了颜色不同外,它与上面的 nav_divider 完全一样。

然后,我创建了一个 drawer_item_background 可绘制对象,如下所示:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/nav_divider_selected" android:state_selected="true"/>
        <item android:drawable="@drawable/nav_divider"/>
</selector>

并且,用这个新选择器 (app:itemBackground="@drawable/drawer_item_background") 替换了 NavigationViewitemBackground。但是,它没有用。出于某种原因,这些项目看起来都是黑色的。

我明白了。这是一个简单的问题。我只是使用了错误的状态。所以,这是解决方案。我创建了两个不同的图层列表(将分隔符添加到导航项):

nav_divider:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:left="@dimen/activity_horizontal_margin">
        <shape android:shape="rectangle">
            <solid android:color="@color/light_gray"/>
        </shape>
    </item>
    <item android:bottom="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>
</layer-list>

nav_divider_selected:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:left="@dimen/activity_horizontal_margin">
        <shape android:shape="rectangle">
            <solid android:color="@color/light_gray"/>
        </shape>
    </item>
    <item android:bottom="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/light_blue"/>
        </shape>
    </item>
</layer-list>

然后,创建一个 drawer_item_background 像这样的可绘制对象(state_checked 不应使用 state_selected):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/nav_divider_selected" android:state_checked="true"/>
        <item android:drawable="@drawable/nav_divider"/>
</selector>

然后我在 NavigationView 中将此可绘制对象用作 itemBackground:

<com.google.android.material.navigation.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="right"
    android:fitsSystemWindows="true"
    android:background="@color/white"
    app:headerLayout="@layout/nav_header"
    app:menu="@menu/drawer_menu"
    app:itemTextColor="@color/drawer_item"
    app:itemIconTint="@color/drawer_item"
    app:itemBackground="@drawable/drawer_item_background"/>

此外,如果您不想使用选择器来实现,您也可以这样做

<group android:checkableBehavior="single">
                <item
                    android:id="@+id/nav_share"
                    android:icon="@drawable/ic_menu_share"
                    android:title="@string/menu_share" />
            </group>

通过将元素包裹在 <group android:checkableBehavior="single"> 下,我们得到了选定的背景。

Try the below item_background.xml in app:itemBackground="@drawable/item_background" for NavigationView

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/rgb_red" android:state_checked="true" />
    <item android:drawable="@color/rgb_red" android:state_activated="true" />
    <item>
        <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:drawable="@color/rgb_white" />
          <item android:start="-2dp"
                android:top="-2dp"
                android:end="-2dp">
               <shape>
                 <solid android:color="@android:color/transparent" />
                 <stroke android:width="1dp" android:color="@color/rgb_pale_gray"/>
               </shape>
          </item>
        </layer-list>
    </item>
</selector>

希望对您有所帮助