DrawerLayout锦茁、Toolbar 的詳細(xì)用法

利用 toolbar + drawerLayout 可以實(shí)現(xiàn)點(diǎn)擊標(biāo)題欄右上角按鈕彈出側(cè)滑菜單的功能崖瞭,例如 網(wǎng)易云音樂 或者 Google Play

1. toolbar 的設(shè)置

  • 打開 res/value/styls.xml 文件栽烂,創(chuàng)建另一套 style 屬性
<style name="AppTheme.base" parent="Theme.AppCompat">
       <item name="windowActionBar">false</item>
       <item name="colorPrimaryDark">#ff0000</item>
       <item name="colorPrimary">#ff0000</item>
       <item name="android:windowBackground">@color/colorPrimaryDark</item>
       <item name="android:windowNoTitle">true</item>
       <item name="windowNoTitle">true</item>
</style>
布局顏色.png

  • 在 activity_main 中添加 Toolbar
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary">
    </android.support.v7.widget.Toolbar>

設(shè)置 background 后才可以使 Toolbar 使用我們定義的顏色設(shè)置


  • 在 MainActivity 中聲明 Toolbar
 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

  • 設(shè)置 Toolbar 中的控件
        toolbar.setTitle("Test Title");
        toolbar.setSubtitle("This is substitle");
        //toolbar.setLogo(R.drawable.ic_launcher); 可以在 Navigation后 設(shè)置一個(gè) logo
        toolbar.setSubtitleTextColor(getResources().getColor(R.color.colorGray)); //設(shè)置二級(jí)標(biāo)題的顏色
        toolbar.setTitleTextColor(getResources().getColor(R.color.colorBlack)); //設(shè)置標(biāo)題的顏色
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.menu_24);   //setNavigationIcon 需要放在 setSupportActionBar 之后才會(huì)生效驱证。
Toolbar 中的控件

  • 設(shè)置上一步中的 onCreateOptionsMenu
  • 先在 res/menu/ 下創(chuàng)建一個(gè) toolbar_menu.xml 文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
   <item
       android:id="@+id/tooLbar_menu"
       android:icon="@drawable/search_24"
       app:showAsAction="always"
       android:title="搜索">
   </item>
</menu>
  • 然后在 MainActivity 中通過(guò) onCreateOptionsMenu 方法填充進(jìn)去創(chuàng)建的布局文件
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar_menu,menu);    
        return true;
    }
  • 給該按鈕添加點(diǎn)擊事件 (需要設(shè)置在 setSupportActionBar 之后才有作用延窜。)
        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                String msg = "";
                switch (item.getItemId()) {
                    case R.id.tooLbar_menu:
                        msg += "Hello World!!!!!!!!!!!!";
                        break;
                    default:
                        break;
                }
                if(!msg.equals("")){
                    Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });

  • 設(shè)置 Toolbar 的小缺點(diǎn)
小缺點(diǎn)布局
  • 首先修改 toolbar_menu.xml 的內(nèi)容
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/tooLbar_menu"
        android:icon="@drawable/search_24"
        android:title="搜索"
        app:showAsAction="always"/>
    <item
        android:id="@+id/itema"
        android:title="item1"
        app:showAsAction="never" />     //設(shè)置成 never 會(huì)自動(dòng)在 Toolbar 的右側(cè)生成一個(gè)小缺點(diǎn)圖標(biāo)
    <item
        android:id="@+id/itemb"
        android:title="item1"
        android:orderInCategory="100"
        app:showAsAction="never" />
    <item
        android:id="@+id/itemc"
        android:title="item1"
        android:orderInCategory="200"
        app:showAsAction="never" />
</menu>

但自動(dòng)生成的缺點(diǎn)圖標(biāo)是官方自帶的小黑點(diǎn),需要在另外一些設(shè)置 (有兩種方法):

方法一:

  • 在 styles.xml 下創(chuàng)建一個(gè) toolbar_style
    <style name="toolbar_style" parent="AppTheme.base">
        <item name="actionOverflowButtonStyle">@style/ActionButton.Overflow</item>
    </style>
    <style name="ActionButton.Overflow" parent="android:style/Widget.Holo.Light.ActionButton.Overflow">
        <item name="android:src">@drawable/setting_poing_white_24</item>
    </style>
```language
  • 在 Toolbar 的設(shè)置中添加 Theme
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:theme="@style/toolbar_style"
            android:background="?attr/colorPrimary">
        </android.support.v7.widget.Toolbar>

方法二:

在 Toolbar 中直接添加 popupTheme

app:popupTheme="@drawable/setting_poing_white_24"

2. 設(shè)置 DrawerLayout

  • 在 build.gradle 中添加 compile 'com.android.support:design:25.3.1' 并 Sync now

  • 設(shè)置布局
  • 在 activity_main.xml 中創(chuàng)建一個(gè) DrawerLayout 布局
<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/drawer_layout"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
   </android.support.v4.widget.DrawerLayout>
  • 在 DrawerLayout 中設(shè)置兩個(gè)布局抹锄,第一個(gè)為主布局逆瑞,第二個(gè)為滑動(dòng)菜單的布局
<?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/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <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:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.nenguou.learnloading.MainActivity">

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

        </android.support.v7.widget.Toolbar>

        <TextView
            android:id="@+id/TextView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/toolbar"
            android:text="Hello World!" />

    </RelativeLayout>
    
    //NavigationView 是 Google 在 5.0 后退出的菜單欄布局,包括頭部(headerLayout)和菜單 (menu)兩部分
    <android.support.design.widget.NavigationView
        android:id="@+id/navigationView_test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"  //設(shè)置菜單的出現(xiàn)位置祈远,start/left 為左呆万,end/right 為右
        android:background="?attr/colorPrimary"     //設(shè)置菜單的背景顏色,不設(shè)置的話為透明效果
        app:headerLayout="@layout/header_layout"    //設(shè)置頭部
        app:menu="@menu/menu_main"                  //設(shè)置菜單(菜單中若想出現(xiàn)分割線车份,可以將一組 item 放在一個(gè) group 里谋减,并且每個(gè) group 都有 id)
        app:itemIconTint="#FFFFFF"                  //設(shè)置菜單里圖標(biāo)的統(tǒng)一顏色,另一種顯示圖標(biāo)原始顏色的方法在下文介紹
        />

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

  • 給 NavigationView 里的選項(xiàng)設(shè)置點(diǎn)擊事件
  • 在MainActivity 中聲明 NavigationView
private NavigationView navigationView;
  • 給 NavigationView 里的選項(xiàng)設(shè)置點(diǎn)擊事件
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                String msg = "";
                switch (item.getItemId()){
                    case R.id.item1:
                        msg += "This is Item1!!!";
                        drawerLayout.closeDrawers();    //關(guān)閉菜單欄
                        break;
                    case R.id.item2:
                        msg += "This is Item2";
                        drawerLayout.closeDrawers();
                        break;
                    case R.id.item3:
                        msg += "This is Item3";
                        drawerLayout.closeDrawers();
                        break;
                    case R.id.item4:
                        msg += "This is Item4";
                        drawerLayout.closeDrawers();
                        break;
                    default:
                        break;
                }
                if(!msg.equals("")){
                    Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
                }
                //drawerLayout.closeDrawers(); 任何一個(gè)按鈕被點(diǎn)擊扫沼,都會(huì)通過(guò) closeDrawers 方法關(guān)閉導(dǎo)航欄
                return true;
            }
        });
  • 在 Java 代碼里使每個(gè)選項(xiàng)的圖片顯示自己的顏色
        navigationView.setItemIconTintList(null);

  • 點(diǎn)擊導(dǎo)航按鈕打開側(cè)邊欄
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                drawerLayout.openDrawer(GravityCompat.START);
        }
        return super.onOptionsItemSelected(item);
    }

歡迎關(guān)注我的博客出爹、簡(jiǎn)書CSDN缎除、GitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末严就,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子器罐,更是在濱河造成了極大的恐慌梢为,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轰坊,死亡現(xiàn)場(chǎng)離奇詭異铸董,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肴沫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門粟害,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颤芬,你說(shuō)我怎么就攤上這事悲幅√锥欤” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵汰具,是天一觀的道長(zhǎng)卓鹿。 經(jīng)常有香客問我,道長(zhǎng)郁副,這世上最難降的妖魔是什么减牺? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任豌习,我火速辦了婚禮存谎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肥隆。我一直安慰自己既荚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布栋艳。 她就那樣靜靜地躺著恰聘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吸占。 梳的紋絲不亂的頭發(fā)上晴叨,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音矾屯,去河邊找鬼兼蕊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛件蚕,可吹牛的內(nèi)容都是我干的孙技。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼排作,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牵啦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起妄痪,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哈雏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后衫生,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裳瘪,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年障簿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盹愚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡站故,死狀恐怖皆怕,靈堂內(nèi)的尸體忽然破棺而出毅舆,到底是詐尸還是另有隱情,我是刑警寧澤愈腾,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布憋活,位于F島的核電站,受9級(jí)特大地震影響虱黄,放射性物質(zhì)發(fā)生泄漏悦即。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一橱乱、第九天 我趴在偏房一處隱蔽的房頂上張望辜梳。 院中可真熱鬧,春花似錦泳叠、人聲如沸作瞄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宗挥。三九已至,卻和暖如春种蝶,著一層夾襖步出監(jiān)牢的瞬間契耿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工螃征, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搪桂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓会傲,卻偏偏與公主長(zhǎng)得像锅棕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淌山,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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