拦截导航抽屉标题中的触摸事件以允许RecyclerView滚动?

时间:2018-07-25 16:19:51

标签: android android-layout android-recyclerview android-touch-event

我正在尝试将可变的用户名列表添加到导航抽屉的标题中。一旦recyclerview的高度超过标题的给定尺寸,我将无法访问recyclerview中的隐藏项目。我想我需要从DrawerLayout中拦截触摸事件,并将它们传递到标题和回收器视图以使其滚动,但是我不确定如何去做。

这是Main Activity 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_main"
    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_main"
    app:menu="@menu/activity_main_drawer" />

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

这是nav_header_main.xml文件:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:id="@+id/addUserLayout"
android:theme="@style/ThemeOverlay.AppCompat.Dark">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="10dp"
    android:textSize="22sp"
    android:text="@string/add_user"
    android:id="@+id/navbarAddUser"/>


<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/rvUsers"/>


</LinearLayout>

我试图构造一个CustomDrawerLayout类,以将标头中的touch事件传递给headerview,但它没有实现我想要的功能。这是该类的onInterceptTouchEvent方法:

    @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {


    NavigationView navigationView = (NavigationView) getChildAt(1);

    View headerView = navigationView.getHeaderView(0);

    final int action = ev.getAction();

    switch(action) {
        case MotionEvent.ACTION_MOVE :
            //if mouse is dragged we dont intercept
            if(ev.getY() < headerView.getHeight() + headerView.getY() &&
                    ev.getX() < headerView.getWidth() + headerView.getX() &&
                    ev.getX() > headerView.getX() &&
                    ev.getY() > headerView.getY()) {
                isScrolling = true;
                Log.d(TAG_DRAWERLAYOUT, "scrolling");
                return false;
            }
            if(isScrolling) {
                Log.d(TAG_DRAWERLAYOUT, "scrolling outside of header");
                return false;
            }
            return true;
        case MotionEvent.ACTION_UP:
            isScrolling = false;
            return super.onInterceptTouchEvent(ev);
    }

    return super.onInterceptTouchEvent(ev);
}

任何帮助将不胜感激!我对Android开发很陌生,显然还有很多东西要学习。

1 个答案:

答案 0 :(得分:0)

对此进行了更多的思考,使我得以针对自己的问题采取适当的解决方法。我没有将Navbar标题作为单独的布局文件放置,而是将我想要的项目包含在标题中,作为NavigationView主体的成员。然后,要移动NavigationDrawer的菜单内容,我使用了一个约束布局,该布局具有透明的背景,并且高度与Navigation View主体中的项目相同。

activity_main.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_main"
    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:menu="@menu/activity_main_drawer"
    app:headerLayout="@layout/nav_header_blank">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <include layout="@layout/nav_header_main"/>

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="@dimen/nav_header_bottom_height"
        android:id="@+id/rvUsers"/>
    </LinearLayout>

</android.support.design.widget.NavigationView>

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

nav_header_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_top_height"
android:background="@drawable/side_nav_bar"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:id="@+id/addUserLayout"
android:theme="@style/ThemeOverlay.AppCompat.Dark">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="16dp"
    android:textSize="22sp"
    android:text="@string/add_user"
    android:id="@+id/navbarAddUser"/>

</LinearLayout>

nav_header_main.xml:

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="176dp"
    android:background="#00FFFFFF">

</android.support.constraint.ConstraintLayout>