Android官方的側(cè)滑控件DrawerLayout

導語

側(cè)滑控件揉稚,以前大家用的可能是三方的SlidingMenu控件化借,最近在看谷歌源碼項目震糖,意外的看到一個 DrawerLayout 控件女揭。上網(wǎng)一查蚤假,原來這個控件是官方給我們提供的一個側(cè)滑菜單控件栏饮。既然谷歌已經(jīng)提供了一個側(cè)滑控件吧兔,我們又何必去用一個三方的SlidingMenu控件來實現(xiàn)相同的效果。于是袍嬉,我決定自己手敲一個Demo來實現(xiàn)看看境蔼。

1、DrawerLayout效果圖

2伺通、DrawerLayout 的介紹

DrawerLayout的官方文檔介紹鏈接:http://androiddoc.qiniudn.com/reference/android/support/v4/widget/DrawerLayout.html
DrawerLayout 類的結(jié)構(gòu)圖如下:


官方中文簡介大概如下:
DrawerLayout作為窗口內(nèi)容的頂層容器箍土,允許從窗口的一個或兩個垂直邊緣拉出交互式“抽屜”視圖。
抽屜定位和布局使用android:layout_gravity 子視圖對應的屬性進行控制罐监,對應于您希望抽屜從哪個側(cè)面出現(xiàn):左側(cè)或右側(cè)(或支持布局方向的平臺版本上的開始/結(jié)束)吴藻。請注意,您只能窗口的每個垂直邊緣的一個抽屜視圖弓柱。如果您的布局在窗口的每個垂直邊緣配置多個抽屜視圖沟堡,則會在運行時拋出異常。
矢空。航罗。。

3屁药、DrawerLayout 的使用

一般使用 DrawerLayout 側(cè)滑菜單粥血,可以通過 Toolbar + DrawerLayout來實現(xiàn)。
在res/layout 中酿箭,新建一個toolbar.xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/tl_custom"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
</android.support.v7.widget.Toolbar>

在新建一個drawerlayout.xml布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dl_left"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--主布局-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </LinearLayout>
    <!--側(cè)滑菜單-->
    <RelativeLayout
        android:layout_width="180dp"
        android:clickable="true"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:background="#fff"
        >

        <LinearLayout
            android:id="@+id/ll_home_navigation_top"
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:layout_alignParentTop="true"
            android:background="@color/colorPrimary"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:src="@mipmap/ic_launcher" />
        </LinearLayout>

        <ListView
            android:id="@+id/lv_left_menu"
            android:layout_below="@id/ll_home_navigation_top"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@null"
            android:text="DrawerLayout" />
    </RelativeLayout>
</android.support.v4.widget.DrawerLayout>

主布局activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <!--Toolbar-->
    <include layout="@layout/custom_toolbar" />
    <!--DrawerLayout-->
    <include layout="@layout/custom_drawerlayout" />
</LinearLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    protected boolean statusBarCompat = true;
    private static long DOUBLE_CLICK_TIME = 0L;

    //聲明相關(guān)變量
    private Toolbar toolbar;
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private ListView lvLeftMenu;
    private String[] lvs = {"Android", "iOS", "Python", "Html5", "Java"};
    private ArrayAdapter arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (statusBarCompat) {
            StatusBarCompat.compat(this, ContextCompat.getColor(this, R.color.colorPrimary));
            transparent19and20();
        }

        findViews(); //獲取控件

        toolbar.setTitle("Drawerlayout");//設(shè)置Toolbar標題
        toolbar.setTitleTextColor(Color.parseColor("#ffffff")); //設(shè)置標題顏色
        setSupportActionBar(toolbar);
        getSupportActionBar().setHomeButtonEnabled(true); //設(shè)置返回鍵可用
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //創(chuàng)建返回鍵复亏,并實現(xiàn)打開關(guān)/閉監(jiān)聽
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, 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.addDrawerListener(mDrawerToggle);
        //設(shè)置菜單列表
        arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, lvs);
        lvLeftMenu.setAdapter(arrayAdapter);

        lvLeftMenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "點擊"+position , Toast.LENGTH_SHORT).show();
            }
        });

    }
    //返回鍵監(jiān)聽
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_MENU && mDrawerLayout != null) {
            if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
                mDrawerLayout.closeDrawer(Gravity.LEFT);
            } else {
                mDrawerLayout.openDrawer(Gravity.LEFT);
            }
            return true;
        }  else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
                mDrawerLayout.closeDrawer(Gravity.LEFT);
            } else {
                if ((System.currentTimeMillis() - DOUBLE_CLICK_TIME) > 2000) {
                    Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
                    DOUBLE_CLICK_TIME = System.currentTimeMillis();
                } else {
                    finish();
                }
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    protected void transparent19and20() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
                && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

    private void findViews() {
        toolbar = (Toolbar) findViewById(R.id.tl_custom);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.dl_left);
        lvLeftMenu = (ListView) findViewById(R.id.lv_left_menu);
    }
}


本文的源碼,如果誰有興趣要的缭嫡,直接關(guān)注微信公眾號后臺回復:側(cè)滑 或者DrawerLayout 缔御。

4、總結(jié)

本文創(chuàng)作時間為4個小時械巡,原創(chuàng)不易刹淌,如果哪里有錯誤或者寫作意見,請幫忙指正和提醒讥耗,謝謝有勾,大家共同進步!

本文屬于原創(chuàng)古程,如有轉(zhuǎn)載蔼卡,請標注原作者,版權(quán)歸本公眾號所有挣磨。如果你喜歡我寫的文章請關(guān)注 程序IT圈 雇逞,歡迎大家繼續(xù)關(guān)注本公眾號的技術(shù)博文荤懂。如果您覺得這篇文章對你有所幫助的話,不妨點個贊或給個贊賞哈塘砸,您的支持就是我堅持原創(chuàng)的動力~~

最后节仿,如果你想寫公眾號和熱愛編程的朋友們,我建立了個技術(shù)微信群掉蔬,可以公眾號回復 "加群" 廊宪,歡迎您進群學習哈~

推薦閱讀
福利篇:學習編程視頻免費領(lǐng)取

Retrofit常見注解全解析

五大步驟快速搭建個人網(wǎng)站

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市女轿,隨后出現(xiàn)的幾起案子箭启,更是在濱河造成了極大的恐慌,老刑警劉巖蛉迹,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傅寡,死亡現(xiàn)場離奇詭異,居然都是意外死亡北救,警方通過查閱死者的電腦和手機荐操,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扭倾,“玉大人淀零,你說我怎么就攤上這事√乓迹” “怎么了驾中?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長模聋。 經(jīng)常有香客問我肩民,道長,這世上最難降的妖魔是什么链方? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任持痰,我火速辦了婚禮,結(jié)果婚禮上祟蚀,老公的妹妹穿的比我還像新娘工窍。我一直安慰自己,他們只是感情好前酿,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布患雏。 她就那樣靜靜地躺著,像睡著了一般罢维。 火紅的嫁衣襯著肌膚如雪淹仑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音匀借,去河邊找鬼颜阐。 笑死,一個胖子當著我的面吹牛吓肋,可吹牛的內(nèi)容都是我干的凳怨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蓬坡,長吁一口氣:“原來是場噩夢啊……” “哼猿棉!你這毒婦竟也來了磅叛?” 一聲冷哼從身側(cè)響起屑咳,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弊琴,沒想到半個月后兆龙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡敲董,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年紫皇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腋寨。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡聪铺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萄窜,到底是詐尸還是另有隱情铃剔,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布查刻,位于F島的核電站键兜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏穗泵。R本人自食惡果不足惜普气,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佃延。 院中可真熱鬧现诀,春花似錦、人聲如沸履肃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榆浓。三九已至于未,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烘浦。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工抖坪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闷叉。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓擦俐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親握侧。 傳聞我的和親對象是個殘疾皇子蚯瞧,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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