我正在尝试将可变的用户名列表添加到导航抽屉的标题中。一旦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开发很陌生,显然还有很多东西要学习。
答案 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>