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

时间:2019-07-17 00:39:42

标签: android navigation-drawer android-navigationview

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

我已使用此post的答案在项目之间添加分隔线。这是我在nav_divider中用作itemBackground的{​​{1}}可绘制对象:

NavigationView

现在,问题是如何更改所选项目的背景颜色。我知道如何在没有分隔线的情况下执行此操作,但是使用分隔线会更加复杂。

更新:

这是我尝试过的:

我创建了另一个名为<?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> 的{​​{1}}替换为新的选择器(itemBackground)。但是,它没有用。由于某种原因,这些项目看起来都是黑色的。

3 个答案:

答案 0 :(得分:0)

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

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>

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

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

答案 1 :(得分:0)

如果万一您不想使用选择器来实现,您可以这样做

<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">下,我们得到了选定的背景。

答案 2 :(得分:0)

在下面尝试以下item_background.xml 适用于NavigationView的app:itemBackground =“ @ drawable / item_background”

<?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>

希望它将对您有帮助