【问题标题】:How to control NavigationView margin between menu items如何控制菜单项之间的 NavigationView 边距
【发布时间】:2016-04-29 16:21:45
【问题描述】:

我有一个包含许多项目的导航抽屉,因此用户需要上下滚动才能查看所有项目。

我想减少各个菜单项之间的边距,以便所有项目都适合标准屏幕,无需滚动。

有没有办法控制菜单项之间的边距?

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在 style.xml 中创建主题

      <style name="NavigationTheme" parent="AppTheme">
          <item name="android:textSize">16sp</item>
          <item name="android:layout_marginBottom">02dp</item>
      </style>
      

      在导航抽屉中应用这个主题

      android:theme="@style/NavigationTheme"
      

      【讨论】:

      • 感谢您的快速回答,但没有奏效。我可以更改文本的大小,但不能更改边距。我已将 marginBottom 设置为 02dp、0dp、-10do,但我无法缩小项目之间的间距。此外,即使我将文本大小更改为 6sp,并且可以在屏幕上看到它非常小,屏幕上也会出现相同数量的项目。似乎给每个项目的空间是固定的,不管边距设置或文本大小。
      【解决方案3】:

      我们可以创建一个drawable并将其设置为NavigationView的 itemBackground属性。我将在下面解释:

      如果我们遍历 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 设置一个客户可绘制对象。我们只在那个drawable中设置了一个高度,比如:

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

      然后将此drawable应用到layout.xml中的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"/>
      

      我知道这不是一个完美的解决方案,但它似乎是唯一适用于我的解决方案。

      【讨论】:

      • 这对我有用,虽然因为我为每个项目都有一个基于状态的背景(所以在选择或正常时颜色不同)我必须更改两个背景可绘制高度以确保高度在项目时保持不变是否被按下。
      【解决方案4】:

      将此粘贴​​到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"
      

      【讨论】:

      • 这与 USKMobility 一年多前发布的答案相同。也可以复制粘贴。
      【解决方案5】:

      dimens.xml中添加以下代码

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多