Android Studio中NavigationView菜单项居中设置失效的技术求助
问题根源
你之前操作不生效的核心原因是:menu资源文件里的<item>标签仅用于定义菜单项的ID、标题、图标等数据属性,不是实际渲染的视图。NavigationView默认使用Material组件库内置的菜单项布局,写死了左对齐规则,直接在menu标签内加gravity、textAlignment这类视图属性,完全不会作用到最终显示的菜单项上。
另外你当前的代码还有两个会拖累居中效果的细节问题:
- NavigationView设置了
android:layout_width="wrap_content",宽度会刚好贴合最长菜单项的内容长度,没有多余水平留白,就算设置了居中,视觉上和左对齐也没区别 - DrawerLayout标签里写的
android:layout_centerHorizontal="true"是RelativeLayout的专属属性,对DrawerLayout完全无效,属于可以删掉的冗余代码
可落地的解决步骤
第一步:修正NavigationView的基础宽度配置
把NavigationView的宽度从wrap_content改成符合Material规范的固定抽屉宽度,给内容留出足够的水平显示空间:
<com.google.android.material.navigation.NavigationView android:id="@+id/nav_view" android:layout_width="280dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/grey_middle" app:itemTextColor="@color/menu" app:menu="@menu/activity_main_drawer" />
注:280dp是Material官方定义的标准抽屉宽度,如果适配小屏设备,可以把宽度设为屏幕宽度的70%,不要直接用match_parent,不然会完全覆盖主页面内容。
第二步:选择适配项目版本的居中实现方案
方案1:样式覆盖(适合Material Components 1.4.0及以上版本)
在res/values/themes.xml中新增针对菜单项的自定义样式,覆盖默认的对齐规则:
<style name="NavMenuItemCenterStyle" parent="Widget.MaterialComponents.NavigationView.Item"> <item name="android:gravity">center</item> <item name="android:textAlignment">center</item> </style>
再回到NavigationView的标签中,引用这个自定义菜单项样式:
app:menuItemStyle="@style/NavMenuItemCenterStyle"
方案2:自定义菜单项布局(全版本通用,100%生效)
如果项目用的Material库版本较低,样式覆盖不生效,可以直接自定义菜单项的渲染布局,没有版本兼容问题:
- 新建布局文件
nav_item_center.xml,实现图标+文字的居中排列:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:gravity="center" android:orientation="horizontal" android:paddingHorizontal="16dp"> <ImageView android:id="@+id/menu_icon" android:layout_width="24dp" android:layout_height="24dp" android:layout_marginEnd="8dp" /> <TextView android:id="@+id/menu_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" /> </LinearLayout> - 在NavigationView标签中,指定用这个自定义布局作为菜单项的渲染模板:
app:itemLayout="@layout/nav_item_center"
注意事项
- 你菜单资源中第一个分组的
nav_normal项设置了android:visible="false",这个配置不影响其他可见菜单项的居中效果;后续如果要显示这个隐藏项,记得控制图标+文字的总宽度不要超过抽屉宽度的80%,避免内容溢出被裁切 - 如果不需要显示菜单项左侧的图标,可以直接在自定义布局里删掉ImageView控件,只保留居中的TextView即可
内容的提问来源于stack exchange,提问作者user15418827
相关产品推荐
相关产品推荐

