DrawerLayout筆記

一. 什么是DrawerLayout(抽屜式導(dǎo)航欄)

抽屜式導(dǎo)航欄是一個面板蚂四,它將應(yīng)用的主要導(dǎo)航選項顯示在屏幕左邊緣。大多數(shù)情況下,它處于隱藏狀態(tài)廓八,但是如果用戶從屏幕左邊緣滑動手指京景,同時在應(yīng)用頂層觸摸操作欄中的應(yīng)用圖標窿冯,它將會顯示出來

二. 說明

  1. DrawerLayout

DrawerLayout是容器ViewGroup,一般包含兩個子布局(要顯示在主頁面的布局和NavigationView(也可以是其他控件确徙,將該控件的layout_gravity指定為start就成了側(cè)邊欄了))醒串,其中要顯示在主頁面的布局一般include布局文件(在 DrawerLayout內(nèi),添加一個包含屏幕主內(nèi)容(當(dāng)抽屜式導(dǎo)航欄處于隱藏狀態(tài)時為主要布局)的視圖和另一個包含抽屜式導(dǎo)航欄內(nèi)容的視圖鄙皇。)如下圖:

DrawerLayout

  1. NavigationView

NavigationView才是左邊的側(cè)滑導(dǎo)航欄芜赌,由header和menu兩部分組成,其中header是普通的layout伴逸,menu部分是普通的menu缠沈,如下圖:


NavigationView
  1. layout_gravity屬性的設(shè)置
  • start:根據(jù)系統(tǒng)語言而定;從左往右的語言就在左邊错蝴,反之在右邊
  • left:滑動菜單在左邊
  • right:滑動菜單在右邊
  1. Toolbar上的觸發(fā)按鈕的實現(xiàn)
  • 更改ActionBar的默認返回按鈕的功能和圖標讓其作為觸發(fā)DrawerLayout的按鈕
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBar actionBar = getSupportActionBar();//得到ActionBar
        if(actionBar!=null){
            actionBar.setDisplayHomeAsUpEnabled(true);//將返回按鈕顯示出來
            actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp);//設(shè)置返回按鈕的圖標
        }
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home://HomeAsUp按鈕的id為android.R.id.home
                mDrawerLayout.openDrawer(GravityCompat.START);//參數(shù)為打開DrawerLayout的方向洲愤,要和xml中的一致
                break;
        }
        return super.onOptionsItemSelected(item);
    }
  • 使用ActionBarDrawerToggle作為觸發(fā)按鈕(該方法已被廢棄)
/*DrawerLayout初始化,以及設(shè)置ActionBar左上角的觸發(fā)按鈕*/
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

三. 使用步驟

  1. layout布局
    activity_main.xml
<android.support.v4.widget.DrawerLayout
    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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <!--主頁面布局-->
    <include layout="@layout/app_bar_main"/>

    <!--
        抽屜顷锰,其中:
        headerLayout屬性是header的布局
        menu是menu布局
    -->
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"/>
</android.support.v4.widget.DrawerLayout>

nav_header_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="@dimen/nav_header_height"
    android:background="@drawable/side_nav_bar"
    android:gravity="bottom"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        app:srcCompat="@android:drawable/sym_def_app_icon" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:text="NickelFox"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hly49366499@gmail.com" />
</LinearLayout>

app_bar_main.xml(主布局)

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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="true"
    tools:context="cn.foxnickel.drawerlayout.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main"/>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="16dp"
        app:srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>

content_main.xml(主布局中的content布局)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/content_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="cn.foxnickel.drawerlayout.MainActivity"
    tools:showIn="@layout/app_bar_main">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>
  1. menu布局
    activity_main_drawer.xml(NavigationView中的menu布局)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_camera"
            android:icon="@drawable/ic_menu_camera"
            android:title="Import" />
        <item
            android:id="@+id/nav_gallery"
            android:icon="@drawable/ic_menu_gallery"
            android:title="Gallery" />
        <item
            android:id="@+id/nav_slideshow"
            android:icon="@drawable/ic_menu_slideshow"
            android:title="Slideshow" />
        <item
            android:id="@+id/nav_manage"
            android:icon="@drawable/ic_menu_manage"
            android:title="Tools" />
    </group>

    <item android:title="Communicate">
        <menu>
            <item
                android:id="@+id/nav_share"
                android:icon="@drawable/ic_menu_share"
                android:title="Share" />
            <item
                android:id="@+id/nav_send"
                android:icon="@drawable/ic_menu_send"
                android:title="Send" />
        </menu>
    </item>
</menu>
  1. 各種配置
    MainActivity
public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*初始化ToolBar*/
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /*初始化FAB(主頁面中的)*/
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Toast.makeText(MainActivity.this,"You clicked the snackBar",Toast.LENGTH_SHORT).show();
                            }
                        }).show();
            }
        });

        /*DrawerLayout初始化柬赐,以及設(shè)置ActionBar左上角的觸發(fā)按鈕*/
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        /*初始化NavigationView,設(shè)置item的監(jiān)聽器*/
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    /*按下返回鍵關(guān)閉抽屜*/
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    /*NavigationView的item的點擊事件*/
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.

        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
            Toast.makeText(this,"You clicked the camera",Toast.LENGTH_SHORT).show();
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);//點擊item之后關(guān)閉Drawer
        return true;
    }
}

四. 總結(jié)

  • DrawerLayout里面只能有兩個子View官紫,一個是實際顯示的布局肛宋,一個便是NavigationView(也可以是其他控件)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末州藕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酝陈,更是在濱河造成了極大的恐慌床玻,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件后添,死亡現(xiàn)場離奇詭異笨枯,居然都是意外死亡,警方通過查閱死者的電腦和手機遇西,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門馅精,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粱檀,你說我怎么就攤上這事洲敢。” “怎么了茄蚯?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵压彭,是天一觀的道長。 經(jīng)常有香客問我渗常,道長壮不,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任皱碘,我火速辦了婚禮询一,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘癌椿。我一直安慰自己健蕊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布踢俄。 她就那樣靜靜地躺著缩功,像睡著了一般。 火紅的嫁衣襯著肌膚如雪都办。 梳的紋絲不亂的頭發(fā)上嫡锌,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音脆丁,去河邊找鬼世舰。 笑死,一個胖子當(dāng)著我的面吹牛槽卫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胰蝠,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼歼培,長吁一口氣:“原來是場噩夢啊……” “哼震蒋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躲庄,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤查剖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后噪窘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笋庄,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年倔监,在試婚紗的時候發(fā)現(xiàn)自己被綠了直砂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡浩习,死狀恐怖静暂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谱秽,我是刑警寧澤洽蛀,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站疟赊,受9級特大地震影響郊供,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜近哟,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一驮审、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椅挣,春花似錦头岔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至量九,卻和暖如春适掰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荠列。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工类浪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肌似。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓费就,卻偏偏與公主長得像,于是被迫代替她去往敵國和親川队。 傳聞我的和親對象是個殘疾皇子力细,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容