Material Design ( 7 ) - DrawerLayout您宪、NavigationView

首發(fā)于我的博客,轉(zhuǎn)載請注明作者和原文鏈接惫搏。

用以實現(xiàn)Android中的抽屜樣式,在Google自己推出BottomNavigation之前蚕涤,抽屜樣式的交互可謂Material Design的標桿筐赔。

添加內(nèi)容布局作為DrawerLayout的首個子view,并設置寬高為match_parent揖铜,不能設置layout_gravity茴丰。

在內(nèi)容布局之下添加抽屜布局,設置layout_gravity天吓,控制其在屏幕的左或右出現(xiàn)贿肩。一般設置高度match_parent,寬度wrap_content龄寞。不能設置多個抽屜布局汰规,會報錯。

抽屜布局呢物邑,其實任意view都可以溜哮,但是Material Design中推薦使用NavigationView。

定義Style

首先修改下我們之前的styles.xml文件色解,設置狀態(tài)欄為透明茂嗓。

在《Material Design ( 1 ) - 主題樣式》的基礎(chǔ)上,再添加如下:
在res/values/styles.xml中添加:

<style name="AppTheme.Fit" parent="AppTheme.NoActionBar"/>

在res/values-v21/styles.xml中添加:

<style name="AppTheme.Fit" parent="AppTheme.NoActionBar">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

NavigationView

完整的NavigationView由頭部自定義布局科阎,下部分的menu布局組成述吸。
app:headerLayout設置頭部布局。
app:menu設置menu布局锣笨。

定義NavigationView頭部布局

在res/layout下創(chuàng)建 nav_header_main.xml:

<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:padding="@dimen/spacing_16"
    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_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_spacing"
        android:text="Android Studio"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

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

</LinearLayout>

定義NavigationView的menu內(nèi)容

在res/menu下創(chuàng)建 drawer_layout.xml:

<menu 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>

DrawerLayout

DrawerLayout需要注意的地方前面說過了蝌矛,直接看XML。

XML布局

<android.support.v4.widget.DrawerLayout
    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:fitsSystemWindows="true"
    android:id="@+id/drawer_layout">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <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"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

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

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />

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

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/drawer_layout" />

</android.support.v4.widget.DrawerLayout>
  • DrawerLayout
    很簡單错英,就是單純作為最外層的布局使用入撒。
    需要注意android:fitsSystemWindows="true",設置為true之后走趋,在5.0以上的設備中就有沉浸式狀態(tài)欄的效果衅金。

  • NavigationView
    app:headerLayout 設置頭部布局噪伊。
    app:menu 設置menu內(nèi)容簿煌。
    android:layout_gravity="start" 必須。如果不設置鉴吹,NavigationView會占滿整個布局姨伟。
    app:itemIconTint menu圖標的顏色
    app:itemBackground menu背景顏色
    app:itemTextColor menu字體的顏色

Java代碼:DrawerLayoutActivity

public class DrawerLayoutActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drawerlayout);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        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.addDrawerListener(toggle);
        toggle.syncState();
    }
}

使用了ActionBarDrawerToggle來給Toolbar的左邊添加一個圖標,帶有一個交互動畫豆励。

在AndroidManifest.xml中注冊該Activity夺荒,同時別忘記把主題設置成我們前面定義過的那個瞒渠。

<activity android:name=".drawerlayout.DrawerLayoutActivity"
    android:theme="@style/AppTheme.Fit"/>

給NavigationView添加點擊事件

這里menu的點擊事件,和頭部布局中的點擊事件需要分開寫技扼。

menu點擊

Activity 需要實現(xiàn) NavigationView.OnNavigationItemSelectedListener 接口伍玖。

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);

重寫下面的方法:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.nav_camera) {
        // Handle the camera action
    } 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);
    return true;
}

頭部布局點擊

  1. 獲取頭部布局
View headerView = navigationView.getHeaderView(0);
  1. 然后通過調(diào)用headerView中的findViewById方法來查找到頭部的控件,設置點擊事件即可剿吻。

NavigationView的menu圖標顏色

上面這么用的時候窍箍,會發(fā)現(xiàn)menu的圖標好像全是統(tǒng)一的一個顏色,那我們想顯示圖片自身的顏色呢丽旅?

navigationView.setItemIconTintList(null);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椰棘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榄笙,更是在濱河造成了極大的恐慌邪狞,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茅撞,死亡現(xiàn)場離奇詭異帆卓,居然都是意外死亡,警方通過查閱死者的電腦和手機米丘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門鳞疲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠕蚜,你說我怎么就攤上這事尚洽。” “怎么了靶累?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵腺毫,是天一觀的道長。 經(jīng)常有香客問我挣柬,道長潮酒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任邪蛔,我火速辦了婚禮急黎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侧到。我一直安慰自己勃教,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布匠抗。 她就那樣靜靜地躺著故源,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汞贸。 梳的紋絲不亂的頭發(fā)上绳军,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天印机,我揣著相機與錄音,去河邊找鬼门驾。 笑死射赛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奶是。 我是一名探鬼主播咒劲,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诫隅!你這毒婦竟也來了腐魂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤逐纬,失蹤者是張志新(化名)和其女友劉穎蛔屹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豁生,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡兔毒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甸箱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片育叁。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芍殖,靈堂內(nèi)的尸體忽然破棺而出豪嗽,到底是詐尸還是另有隱情,我是刑警寧澤豌骏,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布龟梦,位于F島的核電站,受9級特大地震影響窃躲,放射性物質(zhì)發(fā)生泄漏计贰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一蒂窒、第九天 我趴在偏房一處隱蔽的房頂上張望躁倒。 院中可真熱鬧,春花似錦洒琢、人聲如沸秧秉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽福贞。三九已至撩嚼,卻和暖如春停士,著一層夾襖步出監(jiān)牢的瞬間挖帘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工恋技, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拇舀,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓蜻底,卻偏偏與公主長得像骄崩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子薄辅,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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