2018-07-19
生命不息,奋斗不止,万事起于忽微,量变引起质变 -------- Hongyang
什么是 DrawerLayout
抽屉式导航栏是一个面板,它将应用的主要导航选项显示在屏幕左边缘。大多数情况下,它处于隐藏状态,但是如果用户从屏幕左边缘滑动手指,同时在应用顶层触摸操作栏中的应用图标,它将会显示出来。
创建布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
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="false"
tools:openDrawer="start">
<!--首页内容-->
<include
layout="@layout/content_my"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!--抽屉菜单展示内容-->
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="220dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
>
<!--抽屉栏头布局-->
<include layout="@layout/nav_header_drawer_layout__one" />
<!--抽屉栏的列表-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/nav_header_drawer_layout__one" />
<ExpandableListView
android:id="@+id/lvExp1"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:dividerHeight="0dp"
android:background="@color/white"
android:childDivider="#eeeeee"
android:cacheColorHint="#00000000"
android:scrollbarSize="0dp"
android:divider="#eeeeee"
android:indicatorLeft="0dp"
android:indicatorRight="200dp"
/>
</LinearLayout>
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
初始化抽屉式导航栏列表
private ExpandableListView expandableListView;
private NavigationView nav_view;
/** 抽屉布局 **/
private DrawerLayout drawer_layout;
private void initViews() {
nav_view = (NavigationView) findViewById(R.id.nav_view);
drawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout);
// 设置DrawerLayout的宽度,以黄金分割比来设置宽度
DrawerLayout.LayoutParams params = new DrawerLayout.LayoutParams((int) (ScreenUtils.getWidth(this) * 0.618), ViewGroup.LayoutParams.MATCH_PARENT);
// 设置DrawerLayout起始位置
params.gravity = Gravity.START;
nav_view.setLayoutParams(params);
expandableListView = (ExpandableListView) nav_view.findViewById(R.id.lvExp1);
expandableListView.setGroupIndicator(null);
}
侦听打开和关闭事件
要侦听抽屉式导航栏的打开和关闭事件,请在 DrawerLayout 上调用 setDrawerListener() 并向其传递DrawerLayout.DrawerListener 的实现。此接口为抽屉式导航栏事件(例如,onDrawerOpened() 和onDrawerClosed())提供了回调。
drawer_layout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
}
});
但是,如果您的 Activity 包括操作栏,则可扩展 ActionBarDrawerToggle类,而非实现
DrawerLayout.DrawerListener。 ActionBarDrawerToggle实现了 DrawerLayout.DrawerListener,因此您仍然可以替代这些回调,但这还有助于在操作栏图标与抽屉式导航栏之间正确交互(下一部分中将进一步阐述)。
正如抽屉式导航栏设计指南中所述,您应在抽屉式导航栏可见时修改操作栏的内容,例如,更改标题和移除与主内容有关的操作项目。 以下代码显示了如何通过使用 ActionBarDrawerToggle 类的实例替代 DrawerLayout.DrawerListener 回调方法来实现这一点:
drawer_layout.addDrawerListener(new ActionBarDrawerToggle(this,drawer_layout,R.mipmap.pick_ic_open,R.mipmap.nav_sousuo){
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
ToastUtil.showLongToast(MainTableActivity.this,"onDrawerOpened");
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
ToastUtil.showLongToast(MainTableActivity.this,"onDrawerClosed");
}
});
更详细的用法参考Android官方文档 >创建抽屉式导航栏