AndoidX 中 DrawerLayout 的使用
为何要使用 AndroidX
由于 android.support 中结构过于混乱,Google 已推出 AndroidX 来代替 support 包,且不再对 support 提供更新支持
Existing packages, such as the Android Support Library, are being refactored into AndroidX.
Although Support Library versions 27 and lower are still available on Google Maven,
all new development will be included in only AndroidX versions 1.0.0 and higher.
何为 DrawerLayout
DrawerLayout 是 Google 推出的一款能够实现侧滑效果的控件,可以实现如同网易云音乐的左侧菜单效果。实现简单,且提供了很多操作方法,可满足日常的使用。由于 AndroidX 已替代 support 使用,故 DrawerLayout 类目前位于 androidx.drawerlayout.widget 包下。
添加并使用 DrawerLayout
通过布局文件添加 DrawerLayout
DrawerLayout 作为界面的顶层容器,允许用户从界面的一个或两个垂直侧边缘拖拽出界面。建议将 DrawerLayout 做为界面的根布局来使用,以避免可能会出现的触摸事件被屏蔽问题
通过以下代码即可将 DrawerLayout 添加至布局。
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/DrawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.drawerlayout.widget.DrawerLayout>
通过布局文件设计 DrawerLayout
DrawerLayout 包含主界面和侧滑界面。对于 DrawerLayout 内的界面布局有以下几个要求:
- 主界面布局一定要位于所有侧滑界面布局之前,宽度与高度应设置为 match_parent ,并且不能包含 layout_gravity 标签。
- 侧滑界面必须设置 layout_gravity 属性,且当该属性值为 start 或 left 时该侧滑界面从左侧滑出,当该属性值为 end 或 right 时,该侧滑界面从右侧滑出。
- 侧滑界面的高度属性建议设定为 match_parent ,宽度属性建议设置为一个常数。
- 界面任意一个垂直边缘最多允许配置一个侧滑界面,如果在布局时为单个垂直边缘配置了多个侧滑界面,则运行时将引发异常。
通过一下代码创建了一个主界面,采用 LinearLayout 布局,一个侧滑界面,采用LinearLayout 布局,宽度设置为300dp,并设置该侧滑界面从左侧滑出。
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/DrawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"/>
<LinearLayout
android:id="@+id/left_layout"
android:layout_width="300dp"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_gravity="start">
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
通过代码操作 DrawerLayout
通过 id 可以获取到布局文件中插入的 DrawerLayout 对象来进行操作, DrawerLayout 类提供了包括以下展示的多个函数来进行操作。
监听侧滑界面的展开状态
通过添加侦听器来侦听侧滑界面的展开状态, DrawerLayout 提供了以下两个方法来添加侦听器:
void setDrawerListener(DrawerLayout.DrawerListener listener)
DrawerLayout.DrawerListener 包含以下四种抽象方法来侦听侧滑界面展开的状态
void onDrawerClosed(View drawerView) \\ 当侧滑界面处于完全关闭状态时被调用
void onDrawerOpened(View drawerView) \\ 当侧滑界面出语完全打开状态时被调用
void onDrawerSlide(View drawerView, float slideOffset) \\ 当侧滑界面的位置改变时被调用
\\slideOffset 代表侧滑界面的位置,范围为 0~1
void onDrawerStateChanged(int newState) \\ 当侧滑界面的运动状态改变时被调用
需要注意的是避免再动画播放期间执行例如界面布局类型的复杂操作,以避免动画出现卡顿。
控制侧滑界面状态
DrawerLayout 提供了以下方法操作侧滑界面
void closeDrawer(View drawerView) \\ 关闭侧滑界面
void openDrawer(View drawerView) \\ 打开侧滑界面
boolean isDrawerOpen(View drawer) \\ 判断侧滑界面是否处于打开状态
以上三个个方法的传入参数均应是侧滑界面布局对象。例如,打开上个例子中创建的左侧侧滑界面
DrawerLayout drawerLayout = findViewById(R.id.DrawerLayout);
drawerLayout.openDrawer(findViewById(R.id.left_layout));
详情请查阅 官方文档