更改标题组和第一个菜单项之间的抽屉间隙

8

我需要改变标题组和第一个菜单项之间的间距,这是一个示例:

enter image description here

我看过很多示例和帖子,但只能改变所有项目的间距,我只需要更改标题组的间距

有什么好的想法吗?


请分享与您当前导航抽屉配置相关的代码。 - Vasiliy
4个回答

9

RecyclerView创建的NavigationView中有4种类型的项:


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case VIEW_TYPE_NORMAL:
                return new NormalViewHolder(mLayoutInflater, parent, mOnClickListener);
            case VIEW_TYPE_SUBHEADER:
                return new SubheaderViewHolder(mLayoutInflater, parent);
            case VIEW_TYPE_SEPARATOR:
                return new SeparatorViewHolder(mLayoutInflater, parent);
            case VIEW_TYPE_HEADER:
                return new HeaderViewHolder(mHeaderLayout);
        }
        return null;
    }

你感兴趣的是SubheaderViewHolderR.layout.design_navigation_item_subheader 是该ViewHolder所需填充的布局。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="?attr/listPreferredItemHeightSmall"
          android:gravity="center_vertical|start"
          android:maxLines="1"
          android:paddingLeft="?attr/listPreferredItemPaddingLeft"
          android:paddingRight="?attr/listPreferredItemPaddingRight"
          android:textAppearance="@style/TextAppearance.AppCompat.Body2"
          android:textColor="?android:textColorSecondary"/>

正如您所看到的,高度是从主题的listPreferredItemHeightSmall属性中获取的。但是,仅通过更改listPreferredItemHeightSmall的值无法实现您的要求,因为NormalViewHolder的项目也依赖于该值,因此更改它将影响所有其他项目。

一种难以靠谱的方法是使用 getIdentifier() API 在运行时获取此 RecyclerView。 自定义 RecyclerView 的id为 design_navigation_view。 获取后,您可以手动从 RecyclerView 中获取实际的 View(知道您需要哪个子项)。 然后,您可以手动更改该 View 的高度。 但这不可靠,因为:

  • 对于许多此类项,处理起来并不容易,因为您无法知道实际显示了多少项(好吧,您可以,但值得吗?)

  • 必须监听滚动事件并检测何时显示了任何新的 SubheaderViewHolder - 然后应用自定义高度。

我找不到足够的接缝来影响该项的高度。您最好的选择是将自定义布局作为NavigationView的内容提供。

你真是个天才!因为你给我关于design_navigation_item_subheader的信息,我找到了解决问题的方法。基本上,我创建了一个同名的布局,并更改了所需的填充。非常感谢! - Gaston Flores

3
感谢azizbekian,他的答案给了我一个好主意(也许不是最好的,但在我的情况下更简单快速实现)。基本上,我添加了一个同名的布局(这将覆盖它)。之后我改变了所有需要改变的地方,所以结果就是这样的:

enter image description here

enter image description here


2

根据我的经验,处理导航抽屉最好的方式是让它显示一个完整的Fragment。这样可以完全控制其布局和行为。


我明白,但我没有时间和资源来重构这个组件。我试图找到一个变通方法(一个hack),我知道我可以通过这段代码(RecyclerView) ((NavigationView) findViewById(R.id.navigation)).getChildAt(0);从NavigationView中获取recyclerView,所以我的计划是从每个viewholder中获取视图,但目前为止我还没能做到。你有这样做过吗? - Gaston Flores

-1

通过覆盖 Android 支持库中已设置的值,更改 dimen.xml 中的值。

 <dimen name="design_navigation_padding_top_default"
tools:override="true">0dp</dimen>
<dimen name="design_navigation_separator_vertical_padding"tools:override="true">0dp</dimen>
<dimen name="design_navigation_padding_bottom"tools:override="true">0dp</dimen>

这将覆盖所有行之间的填充。这对我不起作用,我只需要更改在屏幕截图上标记的部分的空间。 - Gaston Flores
@GastonFlores 是的,我们可以通过库找到标题和第一个项目之间的边距值,并更改它的值。 - Akshay Nandwana
@GastonFlores 我认为这个链接可以帮助你实现你想要的功能。直接从库中覆盖值。 - Akshay Nandwana

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