如何控制NavigationView菜单项之间的边距

4
我有一个导航抽屉,里面有很多项,用户需要上下滚动才能查看所有项。
我希望减小每个菜单项之间的间距,以便所有项目都适合标准屏幕,无需滚动。
有一种方法可以控制菜单项之间的边距吗?
4个回答

10

这里的回答帮助我减少了组之间的空间。我使用了以下维度。

<dimen tools:override="true" name="design_navigation_separator_vertical_padding">1dp</dimen>

2
我们可以创建一个drawable并将其设置为NavigationViewitemBackground属性。下面我会详细解释:
如果我们浏览NavigationMenuAdapter,我们会发现有四种类型的项目:
private static final int VIEW_TYPE_NORMAL = 0;
private static final int VIEW_TYPE_SUBHEADER = 1;
private static final int VIEW_TYPE_SEPARATOR = 2;
private static final int VIEW_TYPE_HEADER = 3;

我们要处理的是 VIEW_TYPE_NORMAL。开发人员可在下面代码中找到暴露的属性:
case VIEW_TYPE_NORMAL:
      {
        NavigationMenuItemView itemView = (NavigationMenuItemView) holder.itemView;
        itemView.setIconTintList(iconTintList);
        if (textAppearanceSet) {
          itemView.setTextAppearance(textAppearance);
        }
        if (textColor != null) {
          itemView.setTextColor(textColor);
        }
        ViewCompat.setBackground(
            itemView,
            itemBackground != null ? itemBackground.getConstantState().newDrawable() : null);
        NavigationMenuTextItem item = (NavigationMenuTextItem) items.get(position);
        itemView.setNeedsEmptyIcon(item.needsEmptyIcon);
        itemView.setHorizontalPadding(itemHorizontalPadding);
        itemView.setIconPadding(itemIconPadding);
        if (hasCustomItemIconSize) {
          itemView.setIconSize(itemIconSize);
        }
        itemView.setMaxLines(itemMaxLines);
        itemView.initialize(item.getMenuItem(), 0);
        break;
      }

很遗憾,我们无法在 NavigationMenuItemView 之间添加边距的接口。但是,它允许我们设置背景。因此,我们可以为 NavigationView 设置一个指定高度的自定义可绘制对象。我们只需要在这个可绘制对象中设置高度即可,例如:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">
<size android:height="60dp"/>
</shape>

然后在layout.xml中将此drawable应用于NavigationView,例如:
   <com.google.android.material.navigation.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    app:itemBackground="@drawable/bk_menu_item"/>

我知道这不是一个完美的解决方案,但在我的情况下似乎是唯一可行的解决方案。


这对我很有效,尽管因为我为每个项目设置了基于状态的背景(所以在选择或正常情况下颜色不同),我不得不更改两个背景可绘制高度,以确保在按下或未按下项目时高度保持恒定。 - leafcutter

0
将此代码粘贴到styles.xml文件中。
<style name="NavigationTheme" parent="AppTheme">
  <item name="android:textSize">16sp</item>
  <item name="android:layout_marginBottom">02dp</item>
</style>

在导航抽屉中,将以下内容放置在每个项目中:
android:theme="@style/NavigationTheme"

3
这与 USKMobility 一年多前发布的回答完全相同,几乎可以说是复制粘贴。 - Keith Loughnane

0

dimens.xml 文件中添加以下代码

 <dimen tools:override="true" name="design_navigation_icon_padding">16dp</dimen>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接