Android開發之DrawerLayout實現抽屜效果

yungfan發表於2016-04-02

谷歌官方推出了一種側滑選單的實現方式(抽屜效果),即 DrawerLayout,這個類是在Support Library裡的,需要加上android-support-v4.jar這個包。

使用注意點

1、DrawerLayout的第一個子元素必須是預設內容,即抽屜沒有開啟時顯示的佈局(如FrameLayout),後面緊跟的子元素是抽屜內容,即抽屜佈局(如ListView)。

2、抽屜選單的擺放和佈局通過android:layout_gravity屬性來控制,可選值為left、right或start、end。

3、抽屜選單的寬度為 dp 單位而高度和父View一樣。抽屜選單的寬度應該不超過320dp,這樣使用者可以在選單開啟的時候看到部分內容介面。

4、開啟抽屜: DrawerLayout .openDrawer(); 關閉抽屜:DrawerLayout.closeDrawer( );

一個典型的佈局例項:

<android.support.v4.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <!--可以在程式中根據抽屜選單 切換Fragment-->
    <FrameLayout
        android:id="@+id/fragment_layout"
         android:background="#0000ff"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </FrameLayout>
    <!--左邊抽屜選單-->
    <RelativeLayout
        android:id="@+id/menu_layout_left"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:background="#ff0000">
        <ListView
            android:id="@+id/menu_listView_l"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
    </RelativeLayout>
    <!--右邊抽屜選單-->
    <RelativeLayout
        android:id="@+id/menu_layout_right"
        android:layout_width="240dp"
        android:layout_height="match_parent"
       android:layout_gravity="right"
        android:background="#00ff00">
        <ListView
            android:id="@+id/menu_listView_r"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
    </RelativeLayout>
</android.support.v4.widget.DrawerLayout>

這裡存放的是ListView,下面會講配合 Android M推出的NavigationView

遇到的問題

1、在點選DrawerLayout中的空白處的時候,底部的content會獲得事件。
由於Google的demo是一個ListView,所以ListView會獲得焦點,事件就不會傳遞了,看不出來問題。但是如果用的include載入的佈局,會出現這個情況,那麼如何解決?
解決辦法:在include進的那個佈局裡面,新增clickable=true

2、除了抽屜的佈局檢視之外的檢視究竟放哪裡
左、右抽屜和中間內容檢視預設是不顯示的,其他佈局檢視都會直接顯示出來,但是需要將其放在 DrawerLayout 內部才能正常使用(不要放在外面),否則要麼是相互覆蓋,或者就是觸屏事件失效,滾動等效果全部失效。

3、去除左右抽屜劃出後內容顯示頁背景的灰色?
drawerLayout.setScrimColor(Color.TRANSPARENT);

4、如何填充抽屜的劃出後與螢幕邊緣之間的內容(即上面的灰色部分)?
drawerLayout.setDrawerShadow(Drawable shadowDrawable, int gravity)
drawerLayout.setDrawerShadow(int resId, int gravity)

配合NavigationView實現抽屜選單

NavigationView是Android M中提出一個新的MD風格的元件,它將自己一分為二,上面顯示一個通用的佈局,下面顯示一組選單。與DrawerLayout一起使用可以實現通用的側滑選單,佈局如下

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/id_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="Hello World"
            android:textSize="30sp" />
    </RelativeLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nv_menu_left"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="left" //左側選單
        app:headerLayout="@layout/header" //導航的頂部檢視
        app:menu="@menu/menu_drawer_left" /> //導航的底部選單
</android.support.v4.widget.DrawerLayout>

header.xml,很簡單

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="240dp" //設定一下頭部高度
    android:background="#123456" //設定一個背景色
    android:orientation="vertical"
    android:padding="16dp">

    <ImageView
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_marginBottom="16dp"
        android:layout_marginTop="36dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="YungFan" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="http://www.jianshu.com/users/ab557ce505cd/timeline" />
</LinearLayout>

menu_drawer_left.xml,就構造四個簡單選單

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/nav_home"
        android:icon="@mipmap/infusion"
        android:title="Home" />
    <item
        android:id="@+id/nav_messages"
        android:icon="@mipmap/mypatient"
        android:title="Messages" />
    <item
        android:id="@+id/nav_friends"
        android:icon="@mipmap/mywork"
        android:title="Friends" />
    <item
        android:id="@+id/nav_discussion"
        android:icon="@mipmap/personal"
        android:title="Discussion" />

</menu>

實現效果圖

img_4f7b9d64c6cdbad9b49e56906a29c6fe.png
DrawerLayout + NavigationView.png


相關文章