Android 之 Material Design(三)—DrawerLayout+NavigationView+Toolbar(點擊icon打開關(guān)閉側(cè)滑菜單)

前言

關(guān)于Material Design相關(guān)的控件,前兩篇文章已經(jīng)介紹了一些常用的控件了,這篇文章主要介紹一下DrawerLayout+NavigationView+Toolbar宾符。這樣Material Design的也介紹的差不多了,剩下RecyclerView策肝、cardView肛捍、CoordinatorLayout一些控件,以后有機會慢慢再寫之众。

效果圖

這里寫圖片描述

DrawerLayout

介紹:導(dǎo)航欄從左側(cè)滑入拙毫。這是Google應(yīng)用中常見的模式,并且遵循列表的鍵盤和指標棺禾。通常代表應(yīng)用程序在屏幕左邊緣的主要導(dǎo)航選項缀蹄。它大部分時間都是隱藏的,但是當用戶從屏幕的左邊緣滑動手指時會顯示膘婶,或者在應(yīng)用的頂層缺前,用戶觸摸工具欄中的應(yīng)用程序圖標。

NavigationView

介紹:被設(shè)計用于應(yīng)用導(dǎo)航悬襟,提供了一種通用的導(dǎo)航方式衅码,體現(xiàn)了設(shè)計的一致性。而NavigationView的典型用途就是配合之前v4包的DrawerLayout脊岳,作為其中的Drawer部分逝段,即導(dǎo)航菜單的本體部分。NavigationView是一個導(dǎo)航菜單框架割捅,使用menu資源填充數(shù)據(jù)奶躯,使我們可以更簡單高效的實現(xiàn)導(dǎo)航菜單。它提供了不錯的默認樣式亿驾、選中項高亮嘹黔、分組單選、分組子標題莫瞬、以及可選的Header儡蔓。

Toolbar

介紹:Toolbar是在 Android 5.0 開始推出的一個 Material Design 風格的導(dǎo)航控件 ,Google 非常推薦大家使用 Toolbar 來作為Android客戶端的導(dǎo)航欄疼邀,以此來取代之前的 Actionbar 浙值。與 Actionbar 相比, Toolbar 明顯要靈活的多檩小。它不像 Actionbar 一樣,一定要固定在Activity的頂部烟勋,而是可以放到界面的任意位置规求。除此之外,在設(shè)計 Toolbar 的時候卵惦,Google也留給了開發(fā)者很多可定制修改的余地阻肿,這些可定制修改的屬性在API文檔中都有詳細介紹。

使用

一.在build.gradle文件中添加

compile 'com.android.support:appcompat-v7:X.X.X'
compile 'com.android.support:design:X.X.X'
compile 'com.android.support:support-v4:X.X.X'
// X.X.X specify the version

二.style樣式

MD對應(yīng)的style
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>
        <!-- 箭頭 -->
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
        <!--返回鍵樣式-->
        <item name="android:fitsSystemWindows">true</item>
    </style>

    <!-- 左邊的箭頭指示-->
    <style name="DrawerArrowStyle" parent="Base.Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/white</item>
    </style>

三.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="match_parent"
    android:orientation="vertical">

    <!--
        //為了效果更好沮尿,toolbar使用單獨的theme  
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        //修改的是彈出菜單項的theme
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    -->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"></android.support.v7.widget.Toolbar>

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"></FrameLayout>

        <android.support.design.widget.NavigationView
            android:id="@+id/navigation_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:menu="@menu/buttom_navigation"></android.support.design.widget.NavigationView>

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

四.menu代碼

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="none">
        <item
            android:id="@+id/nav_notification"
            android:title="通知" />
        <item
            android:id="@+id/nav_message"
            android:title="私信" />
    </group>
    <group
        android:id="@+id/group_manage"
        android:checkableBehavior="none">
        <item
            android:id="@+id/nav_manage"
            android:title="應(yīng)用管理" />
    </group>
    <group
        android:id="@+id/group_settings"
        android:checkableBehavior="none">
        <item
            android:id="@+id/nav_theme"
            android:title="主題風格" />
        <item
            android:id="@+id/nav_setting"
            android:title="設(shè)置" />
        <item
            android:id="@+id/nav_suggestion"
            android:title="意見反饋" />
        <item
            android:id="@+id/nav_about"
            android:title="關(guān)于" />
    </group>
</menu>

五.Activity代碼

public class DrawerLayoutActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener {
    @BindView(R.id.drawer_layout)
    DrawerLayout mDrawerLayout;
    @BindView(R.id.toolbar)
    Toolbar mToolbar;
    @BindView(R.id.navigation_view)
    NavigationView mNavigationView;

    private ActionBarDrawerToggle mDrawerToggle;

    @Override
    protected int attachLayoutRes() {
        return R.layout.activtiy_drawer_layout;
    }

    @Override
    protected void initView() {
        //設(shè)置toolbar標題文本
        mToolbar.setTitle("首頁");
        //設(shè)置toolbar
        setSupportActionBar(mToolbar);
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            //設(shè)置左上角圖標是否可點擊
            actionBar.setHomeButtonEnabled(true);
            //左上角加上一個返回圖標
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    protected void initDate() {
        //創(chuàng)建返回鍵丛塌,并實現(xiàn)打開關(guān)/閉監(jiān)聽
        /**
         * drawerLayout左側(cè)菜單(或者右側(cè))的展開與隱藏可以被DrawerLayout.DrawerListener的實現(xiàn)監(jiān)聽到较解,
         * 這樣你就可以在菜單展開與隱藏發(fā)生的時刻做一些你希望做的事情。
         * 如果你的activity有actionbar的話赴邻,還是建議你用ActionBarDrawerToggle來監(jiān)聽印衔,ActionBarDrawerToggle實現(xiàn)了DrawerListener,所以他能做DrawerListener可以做的任何事情姥敛,
         * 同時他還能將drawerLayout的展開和隱藏與actionbar的app 圖標關(guān)聯(lián)起來奸焙,當展開與隱藏的時候圖標有一定的平移效果,點擊圖標的時候還能展開或者隱藏菜單彤敛。
         * */
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.close) {
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
            }
        };
        mDrawerToggle.syncState();
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mNavigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        String mString = null;
        switch (id) {
            case R.id.nav_notification:
                mString = "通知";
                break;
            case R.id.nav_message:
                mString = "私信";
                break;
            case R.id.nav_manage:
                mString = "應(yīng)用管理";
                break;
            case R.id.nav_theme:
                mString = "主題風格";
                break;
            case R.id.nav_setting:
                mString = "設(shè)置";
                break;
            case R.id.nav_suggestion:
                mString = "意見反饋";
                break;
            case R.id.nav_about:
                mString = "關(guān)于";
                break;
        }
        mToolbar.setTitle(mString);
        mDrawerLayout.closeDrawer(GravityCompat.START);
        return true;
    }
}

總結(jié)與注意

  • DrawerLayout允許放入兩個直接子控件与帆,第一個控件是主屏幕顯示的內(nèi)容,第二個控件是滑動菜單中顯示的內(nèi)容墨榄。
  • DrawerLayout中android:layout_gravity="start"屬性的意思玄糟,表示會根據(jù)系統(tǒng)語言進行判斷,如果系統(tǒng)語言是從左往右(如漢語袄秩、英語)阵翎,滑動菜單就在左邊;如果系統(tǒng)語言是從右往左(如阿拉伯語)播揪,滑動菜單就在右邊贮喧。
  • 點擊ToolBar icon打開側(cè)滑菜單,需要在onOptionsItemSelected()中添加如下代碼猪狈,意思是交給
    ActionBarDrawerToggle去處理app icon的點擊事件箱沦。由于ActionBarDrawerToggle實現(xiàn)了DrawerListener,所以他能做DrawerListener可以做的任何事情雇庙,控制打開和關(guān)閉谓形。
// Pass the event to ActionBarDrawerToggle, if it returns
// true, then it has handled the app icon touch event
if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
 }
  • 當使用NavigationView時,style中不可以自定義textColorPrimary這個字段疆前,因為我的理解是使用“android:textColorPrimary”需要最小的version為21寒跳。所以會報 Error inflating class android.support.design.widget.NavigationView 這個錯誤。
  • 如果想打造一個比較好看的菜單竹椒,NavigationView這個可以添加menu和headerLayout來實現(xiàn)市面上比較好看的效果童太。
  • NavigationView.setCheckedItem()將菜單某個item設(shè)置為默認選中。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胸完,一起剝皮案震驚了整個濱河市书释,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赊窥,老刑警劉巖爆惧,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锨能,居然都是意外死亡扯再,警方通過查閱死者的電腦和手機芍耘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熄阻,“玉大人斋竞,你說我怎么就攤上這事〗嚷桑” “怎么了窃页?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長复濒。 經(jīng)常有香客問我脖卖,道長,這世上最難降的妖魔是什么巧颈? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任畦木,我火速辦了婚禮,結(jié)果婚禮上砸泛,老公的妹妹穿的比我還像新娘十籍。我一直安慰自己,他們只是感情好唇礁,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布勾栗。 她就那樣靜靜地躺著,像睡著了一般盏筐。 火紅的嫁衣襯著肌膚如雪围俘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天琢融,我揣著相機與錄音界牡,去河邊找鬼。 笑死漾抬,一個胖子當著我的面吹牛宿亡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纳令,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼挽荠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了平绩?” 一聲冷哼從身側(cè)響起坤按,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馒过,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酗钞,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡腹忽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年来累,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘奏。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘹锁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出着裹,到底是詐尸還是另有隱情领猾,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布骇扇,位于F島的核電站摔竿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏少孝。R本人自食惡果不足惜继低,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稍走。 院中可真熱鬧袁翁,春花似錦、人聲如沸婿脸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狐树。三九已至焙压,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褪迟,已是汗流浹背冗恨。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留味赃,地道東北人掀抹。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像心俗,于是被迫代替她去往敵國和親傲武。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,526評論 25 707
  • afinalAfinal是一個android的ioc城榛,orm框架 https://github.com/yangf...
    passiontim閱讀 15,401評論 2 45
  • 側(cè)滑菜單這種設(shè)計揪利,在很多 APP 上面都有看到,例如大版本3.0之前的知乎狠持、網(wǎng)易新聞疟位、滴滴打車等。有些熱衷于 An...
    GinkWang閱讀 25,009評論 2 35
  • 今天把上周從a time logger 上做的記錄生成了報告喘垂。用時間最多依次為:睡覺-工作-交通甜刻,再之后留給了寫作...
    Sanger_桑格閱讀 185評論 0 0
  • 暮雨成簾绍撞。 紅燭融寂,遺世侵寒得院。 撫袖聽風傻铣,纂香燎盡, 空赴經(jīng)年祥绞。 深情偏寡合歡非洲。莫道是、銷魂淩煙蜕径! 離淚涔涔两踏, ...
    程北閱讀 437評論 6 2