更改 header 组和第一项菜单之间的抽屉间距
Change drawer gap between header group and first item menu
我需要更改 header 组和第一项菜单之间的 space,这是一个示例:
我看过很多示例和帖子,但只有 space 可以更改所有项目,我只需要更改 header 组.
有什么想法吗?
根据我的经验,处理导航抽屉的最佳方式是让它显示完整 Fragment
。这使您可以完全控制其布局和行为。
通过覆盖 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>
There are NavigationView
创建的 RecyclerView
中的 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;
}
您感兴趣的 SubheaderViewHolder
. R.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
's item is also dependent 该值,因此更改它也会影响所有其他项目。
偷偷摸摸和 non-reliable 实现的方法是在运行时使用 getIdentifier()
API. The id of the custom RecyclerView
is design_navigation_view
获取此 RecyclerView
。获取后,您可以手动从 RecyclerView
中获取实际的 View
(知道 RecyclerView
中的哪个 child 是您需要的)。然后你可以手动更改那个 View
的高度。但这并不可靠,因为:
对于许多这样的项目来说,处理起来并不容易,因为您不知道实际展示了多少(好吧,您可以,但值得吗?)
您必须侦听滚动事件并检测何时显示任何新的 SubheaderViewHolder
- 然后应用您的自定义高度。
我找不到足够的接缝来影响该项目的高度。您最好的选择是提供您的自定义布局作为 NavigationView
.
的内容
感谢 azizbekian,他的回答给了我一个好主意(也许不是最好的,但对我来说更简单、更快速地实施)。
基本上,我添加了一个同名的布局(这将覆盖它)。
之后我改变了所有我需要的,所以结果是这样的:
我需要更改 header 组和第一项菜单之间的 space,这是一个示例:
我看过很多示例和帖子,但只有 space 可以更改所有项目,我只需要更改 header 组.
有什么想法吗?
根据我的经验,处理导航抽屉的最佳方式是让它显示完整 Fragment
。这使您可以完全控制其布局和行为。
通过覆盖 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>
There are NavigationView
创建的 RecyclerView
中的 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;
}
您感兴趣的 SubheaderViewHolder
. R.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
's item is also dependent 该值,因此更改它也会影响所有其他项目。
偷偷摸摸和 non-reliable 实现的方法是在运行时使用 getIdentifier()
API. The id of the custom RecyclerView
is design_navigation_view
获取此 RecyclerView
。获取后,您可以手动从 RecyclerView
中获取实际的 View
(知道 RecyclerView
中的哪个 child 是您需要的)。然后你可以手动更改那个 View
的高度。但这并不可靠,因为:
对于许多这样的项目来说,处理起来并不容易,因为您不知道实际展示了多少(好吧,您可以,但值得吗?)
您必须侦听滚动事件并检测何时显示任何新的
SubheaderViewHolder
- 然后应用您的自定义高度。
我找不到足够的接缝来影响该项目的高度。您最好的选择是提供您的自定义布局作为 NavigationView
.
感谢 azizbekian,他的回答给了我一个好主意(也许不是最好的,但对我来说更简单、更快速地实施)。 基本上,我添加了一个同名的布局(这将覆盖它)。 之后我改变了所有我需要的,所以结果是这样的: