【问题标题】:Change drawer gap between header group and first item menu更改标题组和第一项菜单之间的抽屉间隙
【发布时间】:2017-05-31 20:16:42
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 请分享与您当前导航抽屉配置相关的代码

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


【解决方案1】:

There areNavigationView 创建的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; }

您感兴趣的是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在那个值上,因此改变它也会影响所有其他的项目。

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

  • 对于许多这样的项目来说处理起来并不容易,因为您无法知道实际显示了多少(嗯,您可以,但值得吗?)

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

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

【讨论】:

  • 你是个天才!因为有了你给我的关于 design_navigation_item_subheader 的信息,我找到了解决问题的方法。基本上我创建了一个具有相同名称的布局,并更改了我需要的填充。非常感谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我明白,但我没有时间和资源来重构这个组件。我尝试找到一种解决方法(hack),我知道我可以使用此代码(RecyclerView) ((NavigationView) findViewById(R.id.navigation)).getChildAt(0); 从 NavigationView 中获取 recyclerView,所以我的计划是从 recycler 中获取每个视图的视图,但目前我做不到它。你做过吗?
    【解决方案4】:

    通过覆盖已在 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>
    

    【讨论】:

    • 这会覆盖所有行之间的填充。这对我不起作用,我只需要更改屏幕截图上标记的部分中的空间。
    • @GastonFlores 是的,我们可以从库中找到页眉和第一项之间的边距值并更改它的值。
    • @GastonFlores 我认为this 会帮助你实现你想要的。直接从库中覆盖值。
    猜你喜欢
    • 2017-09-07
    • 2016-11-25
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2022-11-18
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多