具有选定背景颜色的导航抽屉项目分隔符
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
:
中用作 itemBackground
的 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
的可绘制对象,除了颜色不同外,它与上面的 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"
) 替换了 NavigationView
的 itemBackground
。但是,它没有用。出于某种原因,这些项目看起来都是黑色的。
我明白了。这是一个简单的问题。我只是使用了错误的状态。所以,这是解决方案。我创建了两个不同的图层列表(将分隔符添加到导航项):
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>
希望对您有所帮助
我的 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
:
itemBackground
的 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
的可绘制对象,除了颜色不同外,它与上面的 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"
) 替换了 NavigationView
的 itemBackground
。但是,它没有用。出于某种原因,这些项目看起来都是黑色的。
我明白了。这是一个简单的问题。我只是使用了错误的状态。所以,这是解决方案。我创建了两个不同的图层列表(将分隔符添加到导航项):
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>
希望对您有所帮助