You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Android导航菜单的分组间添加间距?

解决NavigationView菜单分组间添加间距的问题

我明白你想要在NavigationView的菜单分组之间添加间距的需求——之前你尝试的空<group>确实没用,因为group本身只是逻辑分组容器,不会渲染出任何可视的间距。这里有两种简单有效的解决方案,你可以根据需求选择:

方法一:使用空MenuItem实现分组间距(推荐)

这种方法直接、灵活,能精准控制每个分组之间的间距大小:

  1. 首先在res/values/dimens.xml中定义你需要的间距尺寸:
<dimen name="nav_group_spacing">16dp</dimen>
  1. 修改你的navigationmenu.xml,在需要添加间距的两个分组之间插入一个禁用的空MenuItem,设置它的高度为刚才定义的间距:
<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      xmlns:tools="http://schemas.android.com/tools" 
      tools:showIn="navigation_view"> 

<group android:id="@+id/profile" android:checkableBehavior="single"> 
<item android:id="@+id/nav_profile" android:icon="@drawable/ic_my_profile" android:title="@string/nav_item_my_profile" app:actionLayout="@layout/view_alertsbadge" /> 
</group> 

<!-- 分组间距:Profile与Contacts之间 -->
<item
    android:id="@+id/spacer_profile_contacts"
    android:title=""
    android:enabled="false"
    android:height="@dimen/nav_group_spacing"
    android:visible="true"/>

<group android:id="@+id/contacts" android:checkableBehavior="single"> 
<item android:id="@+id/nav_merge" android:icon="@drawable/ic_merge" android:title="@string/nav_item_merge" /> 
<item android:id="@+id/nav_export" android:icon="@drawable/ic_export" android:title="@string/nav_item_export" /> 
<item android:id="@+id/nav_notifications" android:actionLayout="@layout/layout_switch" android:icon="@drawable/ic_notifications" android:title="@string/nav_item_notifications" /> 
</group> 

<!-- 分组间距:Contacts与ShareApp之间 -->
<item
    android:id="@+id/spacer_contacts_share"
    android:title=""
    android:enabled="false"
    android:height="@dimen/nav_group_spacing"
    android:visible="true"/>

<group android:id="@+id/shareapp" android:checkableBehavior="single"> 
<item android:id="@+id/nav_share" android:icon="@drawable/ic_share" android:title="@string/nav_item_share" /> 
<item android:id="@+id/nav_rate" android:icon="@drawable/ic_my_profile" android:title="@string/nav_item_rate" /> 
</group> 

<!-- 分组间距:ShareApp与AboutApps之间 -->
<item
    android:id="@+id/spacer_share_about"
    android:title=""
    android:enabled="false"
    android:height="@dimen/nav_group_spacing"
    android:visible="true"/>

<group android:id="@+id/aboutapps" android:checkableBehavior="single"> 
<item android:id="@+id/nav_report" android:icon="@drawable/ic_report" android:title="@string/nav_item_report" /> 
<item android:id="@+id/nav_faq" android:icon="@drawable/ic_faq" android:title="@string/nav_item_faq" /> 
<item android:id="@+id/nav_about" android:icon="@drawable/ic_about" android:title="@string/nav_item_about" /> 
</group> 

<!-- 分组间距:AboutApps与Logout之间 -->
<item
    android:id="@+id/spacer_about_logout"
    android:title=""
    android:enabled="false"
    android:height="@dimen/nav_group_spacing"
    android:visible="true"/>

<group android:id="@+id/logout" android:checkableBehavior="single"> 
<item android:id="@+id/nav_logout" android:icon="@drawable/ic_logout" android:title="@string/nav_item_logout" /> 
</group> 
</menu>

这个空MenuItem会渲染成一个固定高度的空白区域,而且因为设置了android:enabled="false",不会响应任何点击事件,完美模拟分组间的间距。

方法二:自定义NavigationView样式(适合全局统一控制)

如果你希望所有分组间的间距样式统一,也可以通过修改NavigationView的分割线样式来实现:

  1. res/values/styles.xml中定义自定义NavigationView样式:
<style name="CustomNavigationView" parent="Widget.Design.NavigationView">
    <!-- 设置分组间的分割线高度 -->
    <item name="android:dividerHeight">16dp</item>
    <!-- 设置分割线颜色为透明(如果只需要间距不需要线条) -->
    <item name="android:divider">@android:color/transparent</item>
</style>
  1. 在布局文件中给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="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/navigationmenu"
    style="@style/CustomNavigationView"/>

不过这种方法会影响所有菜单项之间的分割线,如果你只需要分组间的间距,方法一的精准度更高。

内容的提问来源于stack exchange,提问作者Manoj Kumar

火山引擎 最新活动