【问题标题】:I want remove scroll mode from Navigation Drawer Android我想从 Navigation Drawer Android 中删除滚动模式
【发布时间】:2017-07-25 15:26:00
【问题描述】:

i want remove this space from navigation drawer

我想从导航抽屉中删除滚动模式或任何用于创建没有菜单的自定义导航抽屉的解决方案

这是我的布局代码。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never"
    tools:openDrawer="end">

        <include
        layout="@layout/app_bar_live"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        app:headerLayout="@layout/nav_header_live"
        android:overScrollMode="never" />

</android.support.v4.widget.DrawerLayout>

【问题讨论】:

    标签: android android-layout navigation-drawer


    【解决方案1】:

    创建真正自定义的 NavDrawer 是可能的,只需对组件进行少量调整。

    步骤如下:

    1 - 没有菜单布局,只有headerView

     <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view_end"
        android:layout_width="match_parent"
        android:layout_marginLeft="-64dp"
        android:layout_marginStart="-64dp"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/shop_list"
        />
    

    请注意,我将 margin start 和 left 设置为 -64dp。这是为了让抽屉布局全宽。

    2 - 禁用 NavigationMenuView 的滚动

    即使我们没有放置菜单布局,它仍然被创建,我们需要访问它并禁用滚动。因为这个视图是 RecyclerView 的实例,我们只需要覆盖它的布局管理器并禁用垂直滚动。

    private fun disableMenuScroll(navView: NavigationView) {
        val navMenu = navView.getChildAt(0) as NavigationMenuView
        navMenu.layoutManager = object : LinearLayoutManager(this) {
            override fun canScrollVertically(): Boolean {
                return false
            }
        }
    }
    

    3 - 将标题布局设置为全高

    在这里,我们使用反射从HeaderView 获取presenter,并从该演示者那里获取包含我们headerLayout 的LinearLayout。 LinearLayout 是不让我们的布局拉伸以匹配父级的那个。我们只需更改该 LinearLayout 的 LayoutParams 即可。

    private fun changeDrawerLayoutHeight(navView: NavigationView) {
    
        /*With reflection get the navView's presenter*/
        val field = navView.javaClass.getDeclaredField("presenter")
        field.isAccessible = true
    
        val presenter = field.get(navView) as NavigationMenuPresenter
    
        /*From presenter, get the header layout field*/
        val layoutField = presenter.javaClass.getDeclaredField("headerLayout")
        layoutField.isAccessible = true
    
        val headerLayout = layoutField.get(presenter) as LinearLayout
    
        /*Set layout params on the HeaderLayout to match parent*/
        val params = headerLayout.layoutParams
        params.height = LinearLayout.LayoutParams.MATCH_PARENT
        headerLayout.layoutParams = params
    }
    

    这段代码在哪里执行?

    在您的 Activity 的 onCreate 方法中。这是执行此操作所需的代码:

        val navView = findViewById<NavigationView>(R.id.nav_view_end)
        disableMenuScroll(navView)
        changeDrawerLayoutHeight(navView)
    

    希望这对某人有所帮助!

    【讨论】:

      【解决方案2】:

      尝试将此添加到根标签 (android.support.v4.widget.DrawerLayout)...希望它有所帮助。

      android:fitsSystemWindows="true"
      

      并尝试从根标签和导航视图中删除该 android:overScrollMode

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多