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

时间:2017-05-31 20:16:43

标签: java android android-layout android-navigation-drawer navigationview

我需要更改标题组和第一项菜单之间的空格,这里有一个例子:

enter image description here

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

有什么想法吗?

4 个答案:

答案 0 :(得分:9)

There are RecyclerViewNavigationView创建的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的项is also dependent,因此更改它也会影响所有其他项。< / p>

实现这一目标的偷偷摸摸且不可靠的方法是使用getIdentifier() API在运行时获取此RecyclerView。自定义RecyclerView的ID为design_navigation_view。获得后,您可以从View手动获取实际RecyclerView(知道RecyclerView的哪个孩子是您需要的孩子)。然后,您可以手动更改View的高度。但这不可靠,因为:

  • 对于许多此类物品而言,它很难处理,因为你无法知道它们中有多少是实际显示的(好吧,你可以,但值得吗?)

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

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

答案 1 :(得分:3)

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

enter image description here

enter image description here

答案 2 :(得分:2)

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

答案 3 :(得分:-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>