如何更改NavigationView中子菜单项的缩进?

7

当我们定义一个带有子菜单项的NavigationView时,它会将子项与部分标题左对齐:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:title="Sub items">
    <menu>
        <item
            android:title="Sub item 1" />
        <item
            android:title="Sub item 2" />
    </menu>
</item>
</menu>

enter image description here

我尝试添加一个透明的图片,并确保它具有正确的大小来填充:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:title="Sub items">
    <menu>
        <item
            android:icon="@drawable/ic_transparent"
            android:title="Sub item 1" />
        <item
            android:icon="@drawable/ic_transparent"
            android:title="Sub item 2" />
    </menu>
</item>
</menu>

enter image description here

默认情况下,NavigationView:

  1. 在图标和文本之间添加固定的填充
  2. 强制对图标本身进行固定大小的设置

我找不到如何配置此填充以及图标大小的方法。

问题 我们如何更改子项缩进,使得子项更加缩进?

我更喜欢通过属性清除而不是插入透明图像来实现它。


嗨,你解决了这个问题吗? - Noundla Sandeep
还没有。自从我发布这个以来,我还没有研究过它。需要完成其他更高优先级的工作。但是我开始思考,也许缩进不是更好的设计-毕竟在Material Design指南中我没有看到推荐它。我将在接下来的几周内再次研究这个问题。所以我会在那时发布更新。 - infinite-loop
@Noundla 再次研究后,我没有找到实现它的方法。我目前的看法是,在 Material Design 指南中不提倡缩进,因此我认为在 Android 中不考虑它是最佳实践,因此我远离它。相反,更好的方法是使用每个菜单行的背景和前景颜色来指示分组。我已经看到许多应用程序很好地完成了这项工作。顺便说一下,我所说的前景颜色是文本颜色。您还可以集成字体类型以强调分组和状态的不同方面。 - infinite-loop
2个回答

9

免责声明

请查看我对主要问题中Noundla的评论,我在其中解释了为什么我认为缩进不是正确的方法。

答案

话虽如此,如果你必须使用缩进,则最简单的方法是在每个菜单项之间添加空格。这不是最理想的方法,但很容易实现、理解,并且在更好的选择出现时可以替换它。它适用于内置的Android NavigationView,无需引入外部库:

以下是可用的代码示例:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:title="Sub items">
    <menu>
        <item android:title="&#160;&#160;&#160;&#160;Sub item 1" />
        <item android:title="&#160;&#160;&#160;&#160;Sub item 2" />
    </menu>
   </item>
</menu>

我希望这篇文章能够节省某些人的时间。

2

不确定您是否得到答案,但我曾经遇到同样的问题,最终使用了MaterialDrawer - https://github.com/mikepenz/MaterialDrawer

您需要扩展SecondaryDrawerItem并在onPostBindView中添加填充。

drawer = new DrawerBuilder()
            .withActivity(this)
            .withHeader(drawerHeader)
            .withSavedInstance(savedInstanceState)
            .addDrawerItems(
                    new PrimaryDrawerItem().withName("Item1"),
                    new CustomSecondaryDrawerItem().withName("SubItem1"),
                    new CustomSecondaryDrawerItem().withName("SubItem2")
            )
            .build();

CustomDrawerSecondaryItem.java

public class CustomSecondaryDrawerItem extends SecondaryDrawerItem {

   @Override
   public void onPostBindView(IDrawerItem drawerItem, View view) {

       Context ctx = view.getContext();

       int paddingLeft = ctx.getResources().getDimensionPixelSize(R.dimen.drawer_secondary_item_padding_left);
       view.setPadding(paddingLeft, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());

       super.onPostBindView(drawerItem, view);

   }
}

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