Android 侧边栏

简介

侧边栏,又叫侧滑菜单,又叫抽屉菜单,一般用于导航功能,侧边滑入或者从标题栏导航图标进入。跟据google设计建议,左侧边栏一般用于app导航,右侧边栏用于操作当前页面内容。
侧边栏由两个部分组成: 布局(DrawerLayout)和侧边栏视图(DrawerView)

布局

Android提供的布局是: android.support.v4.widget.DrawerLayout

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:fitsSystemWindows="true">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <!-- 其他界面 -->
    </RelativeLayout>
    <android.support.design.widget.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/drawer"
        />
    <android.support.design.widget.NavigationView
        android:id="@+id/navigationView2"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/drawer"
        />

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

DrawerLayout只是一个布局,用于帮助显示/隐藏导航菜单(DrawerView),它是通过android:layout_gravity属性来识别导航菜单的,在上面的布局中,navigationView设置了属性android:layout_gravity=”start”表示这个view是左边的导航菜单,同样navigationView2设置了属性android:layout_gravity=”end”表示这是右边的导航菜单。
值得注意的是,只有屏幕垂直边才有导航菜单,而且每条边最多能有一个,如果你设置了属性android:layout_gravity=”top”,应用在启动后会崩溃。

值得注意的是,内容布局必须放在DrawerLayout中第一个位置,width和height属性都设置为match_parent,并且不能有layout_gravity属性,不然应用会崩溃:

To use a DrawerLayout, position your primary content view as the first child with width and height of match_parent and no layout_gravity>. Add drawers as child views after the main content view and set the layout_gravity appropriately. Drawers commonly use match_parent for height with a fixed width.

布局提供的功能

DrawerLayou主要功能:
1.包含drawerView到界面
2.监听drawerView的打开、关闭、滑动事件:
函数:

//Adds the specified listener to the list of listeners that will be notified of drawer events.
addDrawerListener(DrawerLayout.DrawerListener listener)

DrawerListener 接口如下:

//Called when a drawer has settled in a completely closed state.
abstract void   onDrawerClosed(View drawerView)

//Called when a drawer has settled in a completely open state.
abstract void   onDrawerOpened(View drawerView)

//Called when a drawer's position changes.
abstract void   onDrawerSlide(View drawerView, float slideOffset)

//Called when the drawer motion state changes.
abstract void   onDrawerStateChanged(int newState)

可以使用SimpleDrawerListener/ActionBarDrawerToggle只实现部分事件的监听。

3.响应界面操作,实现DrawerView的显示和隐藏

closeDrawer(View drawerView)//Close the specified drawer view by animating it into view.
closeDrawer(int gravity) //Close the specified drawer by animating it out of view.
closeDrawer(View drawerView, boolean animate)//Close the specified drawer view.
closeDrawer(int gravity, boolean animate)//Close the specified drawer.
closeDrawers()//Close all currently open drawer views by animating them out of view.

openDrawer(View drawerView)//Open the specified drawer view by animating it into view.
openDrawer(int gravity)//Open the specified drawer by animating it out of view.
openDrawer(int gravity, boolean animate)//Open the specified drawer.
openDrawer(View drawerView, boolean animate)//Open the specified drawer view.

从上面可以看出,drawerlayout使用drawerView或者gravity来标识一个drawerView.

联合toolbar使用

主要是在toolbar的最左侧有一个导航图标,可以实现点击导航图标直接打开侧边栏。
方式一:

toolbar.setNavigationIcon(android.R.drawable.ic_menu);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showNavigationView();//调用DrawerLayout.openDrawer打开侧边栏
    }
});

方式二:
由于方式一没有动画,而且需要自己找一个图标,所以有了方式二

protected void onCreate(Bundle savedInstanceState) {
    //...
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    mDrawerLayoutView= (DrawerLayout) findViewById(R.id.drawer_layout);
    mActionBarDrawerToggle=new ActionBarDrawerToggle(this,mDrawerLayoutView,toolbar,R.string.app_name,R.string.app_name);
    mDrawerLayoutView.addDrawerListener(mActionBarDrawerToggle);
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
   super.onPostCreate(savedInstanceState);
   mActionBarDrawerToggle.syncState();
}

DrawerView

可以使用任何自定义布局作为侧边栏内容,比如使用一个ListView来做菜单。
比较方便地是使用android.support.design.widget.NavigationView

参考:
Creating a Navigation Drawer
Material DesignDrawerLayout的旋转箭头的实现方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值