1.首先我們來了解一下DrawerLayout:
DrawerLayout是Support Library包中實現了側滑選單效果的控制元件,可以說drawerLayout是因為第三方控制元件如MenuDrawer等的出現之後,google借鑑而出現的產物。drawerLayout分為側邊選單和主內容區兩部分,側邊選單可以根據手勢展開與隱藏(drawerLayout自身特性),主內容區的內容可以隨著選單的點選而變化(這需要使用者自己實現)。2. 功能需求
我這裡是viewpager加fragment搭建的頁面框架 4個便籤分別為tab1 tab2 tab3 tab4 只有在tab4頁面中實現滑動出現側滑選單的功能 在tab4中還需要在使用者登入的前提下才可以滑動出側滑選單 那我們如何來控制元件側滑選單的關閉與開啟呢?
3. 我們先來看學習一下如何使用DrawerLayout:
<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<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">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout //主內容
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
The drawer is given a fixed width in dp and extends the full height of
the container. A solid background is used for contrast
with the content view. -->
<ListView //側滑選單
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/></android.support.v4.widget.DrawerLayout>
4. 接下來我們來看一下DrawerLayout的屬性:
鎖定模式有四種:
- LOCK_MODE_LOCKED_CLOSED:關閉抽屜的滑動操作並將抽屜收起
- LOCK_MODE_LOCKED_OPEN:關閉抽屜的滑動操作並將抽屜開啟
- LOCK_MODE_UNDEFINED:將鎖定模式重新設定到預設狀態
- LOCK_MODE_UNLOCKED:解鎖對抽屜的滑動操作鎖定
5.邏輯:
這樣我們在tab4中可以通過eventbus來告訴DrawerLayout我們是想要開啟還是關閉了
6.容易出現的問題:
1. 當點選側滑選單的佈局時 觸發了側滑選單覆蓋的下面佈局的點選事件
這時我們需要加入:
mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() { //當側拉欄滑動的時候呼叫此方法 @Override public void onDrawerSlide(View drawerView, float slideOffset) { }//當側拉欄開啟的時候呼叫此方法 @Override public void onDrawerOpened(View drawerView) { drawerView.setClickable(true); } //當側拉欄關閉的時候呼叫此方法 @Override public void onDrawerClosed(View drawerView) { } @Override public void onDrawerStateChanged(int newState) { }});
需要將其放在 DrawerLayout 內部才能正常使用(不要放在外面),否則要麼是相互覆蓋,
或者就是觸屏事件失效,滾動等效果全部失效。
drawerLayout.setScrimColor(Color.TRANSPARENT);