禁用工具栏滚动

我有当前的设置:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/coordiator_layout_in_main" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" app:layout_scrollFlags="scroll|enterAlways"/> </android.support.design.widget.AppBarLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.design.widget.NavigationView android:layout_width="170dp" android:layout_height="match_parent" android:fitsSystemWindows="true"/> <FrameLayout // I place a fragment containing a viewpager containing fragments that contain a recyclerview.... android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_toRightOf="@+id/nav_view"> </FrameLayout> </RelativeLayout> <FrameLayout android:id="@+id/settings_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="invisible"> </FrameLayout> <android.support.design.widget.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_refresh" app:layout_anchor="@id/coordiator_layout_in_main" app:layout_anchorGravity="bottom|right|end" app:layout_behavior="com.material.widget.MyFloatingActionButtonBehavior" /> </android.support.design.widget.CoordinatorLayout> 

现在,如果我在包含片段的framelayout内滚动,则所有内容都按预期工作,工具栏可以随意滑入和滑出

现在的重点是, 如果我滚动框架布局(和相关布局中)的NavView,我想禁用工具栏滑入和滑出

但是不pipe是否删除了所有的滚动行为,工具栏都会一直保持滑入和滑出状态(只有这样,才能从appbarlayout中删除滚动标志,但是禁止所有滑入和滑出)

请问我在这里错过了什么? 是不是应该把滚动事件传递给CoordinatorLayout?

Solutions Collecting From Web of "禁用工具栏滚动"

不幸的是, NavigationView包含了RecyclerView NavigationMenuView ,所以它在滚动时支持嵌套滚动和移动AppBarLayout 。 解决这个问题的最好方法是将NavigationView移出CoordinatorLayout 。 如果这是不可能的,你可以尝试下面的代码,我没有testing过。

 final RecyclerView navigationMenuView = (RecyclerView) findViewById(R.id.design_navigation_view); navigationMenuView.setNestedScrollingEnabled(false); 

请注意,即使此代码有效,devise库更新时也会中断。

将DrawViewLayout内的NavigationView和DrawerLayout主要内容中的CoordinatorLayout移动。

从文档:

NavigationView通常放置在DrawerLayout中。

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <!-- Your contents --> <android.support.design.widget.NavigationView android:id="@+id/navigation" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:menu="@menu/my_navigation_items" /> </android.support.v4.widget.DrawerLayout> 

尝试这个,

把这个activity_screen.xml

 <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:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/app_bar_screen" 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="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_home_screen" app:itemIconTint="@color/app_theme_color" app:menu="@menu/activity_home_screen_drawer" /> </android.support.v4.widget.DrawerLayout> 

把这个app_bar_screen.xml

  <android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.test.app.HomeScreenActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay"/> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_screen" /> </android.support.design.widget.CoordinatorLayout> 

把这个content_screen.xml

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/app_bar_home_screen" android:id="@+id/content_frame" android:background="@android:color/white" tools:context="com.test.app.HomeScreenActivity"> </RelativeLayout> 

ToolBar app:layout_scrollFlags="scroll|enterAlways"删除这行代码app:layout_scrollFlags="scroll|enterAlways" 。 在我的情况下工作。

对于任何可能感兴趣的人,这是我如何处理这个问题。

我通过从源代码复制相关文件创build了我的自定义版本的NavigationView,

他们是:

  • NavigationView.java
  • NavigationMenuItem.java
  • NavigationMenuPresente.java
  • NavigationMenuView.java
  • ThemeUtils.java

修复导入,以便新的NavigationView指向新复制的文件。

最后,将这个setNestedScrollingEnabled(false)添加到NavigationMenuView的构造函数中。

这是因为@Michael正确地指出了NavigationMenuView是一个RecyclerView,因此它将其滚动事件传递给NestedScrollingParent (CoordinatorLayout),通过设置setNestedScrollingEnabled(false)我们禁用了这个行为,我们得到了所需的结果(滚动NavView不展开/折叠AppBar)