Android抽屜式導(dǎo)航

版權(quán)聲明:本作品采用知識(shí)共享署名-相同方式共享 4.0 國(guó)際許可協(xié)議進(jìn)行許可。
轉(zhuǎn)載或引用前請(qǐng)注明來(lái)自踏雪cc 侵權(quán)必究。

Android抽屜式導(dǎo)航隧甚,也就是側(cè)滑菜單,大家對(duì)這種設(shè)計(jì)一定都不陌生了,現(xiàn)在很多應(yīng)用使用了抽屜式導(dǎo)航,最常見(jiàn)的就是QQ。
本文通過(guò)一個(gè)示例來(lái)演示怎么使用Google支持庫(kù)提供的DrawerLayout實(shí)現(xiàn)抽屜式導(dǎo)航峭判。對(duì)什么時(shí)候該使用這種設(shè)計(jì)給出一些建議开缎。

示例

gradle配置:

dependencies {
    compile 'com.android.support:appcompat-v7:25.0.0'
}

布局

抽屜式導(dǎo)航欄疗认,包含兩部分視圖完残,一部分用來(lái)顯示屏幕主內(nèi)容,一部分顯示導(dǎo)航欄横漏,導(dǎo)航欄可以是列表谨设,也可以是其它的組件。
創(chuàng)建activity_drawer.xml缎浇,把DrawerLayout作為布局的根視圖扎拣,content_frame為屏幕主內(nèi)容(運(yùn)行時(shí)以Fragment填充),left_drawer為左側(cè)導(dǎo)航欄素跺。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="@dimen/drawer_menu_width"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:choiceMode="singleChoice"
        android:background="@android:color/white"/>

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

注意:

  1. content_frame必須是第一個(gè)子視圖二蓝,因?yàn)閤ml會(huì)對(duì)布局按層疊順序排序。
  2. left_drawer必須指定layout_gravity指厌,如果不指定會(huì)有異常刊愚。
  3. left_drawer的寬度不應(yīng)該超過(guò)320dp,這樣用戶(hù)始終可以看到屏幕主內(nèi)容部分踩验。

填充左側(cè)導(dǎo)航欄

drawer_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/textview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?android:attr/activatedBackgroundIndicator"
    android:padding="16dp"
    android:textColor="#333333"
    android:textSize="16sp"
    tools:text="測(cè)試"/>

在arrays.xml定義字符串?dāng)?shù)組

<string-array name="drawer_menu">
        <item>@string/movie</item>
        <item>@string/music</item>
        <item>@string/book</item>
</string-array>

Activity里獲取字符串?dāng)?shù)組鸥诽,并使用ArrayAdapter填充

private String[] mTitles;
mTitles = getResources().getStringArray(R.array.drawer_menu);
        mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.activity_main_list_item, mTitles));
        mDrawerList.setOnItemClickListener(this);

OnItemClick里面用Fragment填充主內(nèi)容部分

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
        selectItem(position);
    }

    private void selectItem(int position){
        Fragment fragment = new DrawerFragment();
        Bundle args = new Bundle();
        args.putInt(DrawerFragment.DRAWER_NUMBER, position);
        fragment.setArguments(args);
        getFragmentManager().beginTransaction()
                .replace(R.id.content_frame, fragment, DrawerFragment.TAG)
                .commit();
        mDrawerList.setItemChecked(position, true);//選中的導(dǎo)航高亮顯示
        setTitle(mTitles[position]);//設(shè)置標(biāo)題
        mDrawerLayout.closeDrawer(mDrawerList);//關(guān)閉左側(cè)導(dǎo)航欄
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle=title;
        getActionBar().setTitle(title);
    }

主內(nèi)容部分

DrawerFragment接收DrawerActivity傳遞過(guò)來(lái)的數(shù)據(jù),顯示對(duì)應(yīng)的標(biāo)題

public class DrawerFragment
        extends Fragment {
    public final static String DRAWER_NUMBER = "number";
    public final static String TAG = "DrawerFragment";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_drawer_content, container, false);
        int i = getArguments().getInt(DRAWER_NUMBER);
        String str = getResources().getStringArray(R.array.drawer_menu)[i];
        TextView textView = (TextView) view.findViewById(R.id.textview);
        textView.setText(str);
        return view;
    }
}

fragment_drawer_content.xml

<?xml version="1.0" encoding="utf-8"?>
<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="horizontal">

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/common_padding"
        android:textColor="@color/common_text_color"
        android:textSize="@dimen/common_text_size"
        tools:text="測(cè)試"/>

</LinearLayout>

這時(shí)候就已經(jīng)實(shí)現(xiàn)了DrawerLayout的基本功能了箕憾,可以通過(guò)手勢(shì)打開(kāi)側(cè)邊欄衙传,點(diǎn)擊跳轉(zhuǎn)到對(duì)應(yīng)的內(nèi)容頁(yè)。

監(jiān)聽(tīng)打開(kāi)和關(guān)閉事件

要監(jiān)聽(tīng)導(dǎo)航欄打開(kāi)和關(guān)閉事件厕九,需要在DrawerLayout上調(diào)用setDrawerListener()蓖捶,并向其傳遞DrawerLayout.DrawerListener的實(shí)現(xiàn)。
如果使用了ActionBar扁远,可以擴(kuò)展ActionBarDrawerToggle類(lèi)

private ActionBarDrawerToggle mDrawerToggle;
        
        mDrawerToggle=new ActionBarDrawerToggle(this,
                mDrawerLayout,
                R.drawable.ic_drawer,
                R.string.drawer_open,
                R.string.drawer_close){

            public void onDrawerClosed(View view){
                super.onDrawerClosed(view);
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView){
                super.onDrawerOpened(drawerView);
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

什么時(shí)候該用側(cè)邊欄俊鱼?

雖然現(xiàn)在很多應(yīng)用都使用了側(cè)邊欄的樣式刻像,但是并不是所有的場(chǎng)景都適合側(cè)邊欄局,需要根據(jù)具體場(chǎng)景來(lái)分析并闲。用戶(hù)體驗(yàn)設(shè)計(jì)師們:側(cè)邊抽屜式導(dǎo)航可能會(huì)降低你產(chǎn)品一半的用戶(hù)參與度 這篇文章通過(guò)實(shí)際場(chǎng)景分析了什么情況該使用側(cè)邊欄细睡,不想看的童鞋可以直接看下面的結(jié)論:

如果應(yīng)用主要的功能和內(nèi)容都在一個(gè)頁(yè)面里面。只是一些用戶(hù)設(shè)置和選項(xiàng)需要顯示在其他頁(yè)面里帝火。處于讓主頁(yè)面看上去干凈美觀的目的可以把這些輔助功能放在側(cè)邊欄里溜徙。
而如果你的應(yīng)用有不同的視圖,且他們是平級(jí)的犀填,需要用戶(hù)同等地對(duì)待蠢壹,側(cè)邊欄將會(huì)浪費(fèi)掉大多數(shù)的用戶(hù)對(duì)于側(cè)邊欄中入口的潛在參與度和交互程度。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末九巡,一起剝皮案震驚了整個(gè)濱河市图贸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冕广,老刑警劉巖疏日,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撒汉,居然都是意外死亡沟优,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)睬辐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)净神,“玉大人,你說(shuō)我怎么就攤上這事溉委【槲ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵瓣喊,是天一觀的道長(zhǎng)坡慌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)藻三,這世上最難降的妖魔是什么洪橘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮棵帽,結(jié)果婚禮上熄求,老公的妹妹穿的比我還像新娘。我一直安慰自己逗概,他們只是感情好弟晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般卿城。 火紅的嫁衣襯著肌膚如雪枚钓。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天瑟押,我揣著相機(jī)與錄音搀捷,去河邊找鬼。 笑死多望,一個(gè)胖子當(dāng)著我的面吹牛嫩舟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怀偷,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼家厌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了枢纠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤黎棠,失蹤者是張志新(化名)和其女友劉穎晋渺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脓斩,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡木西,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了随静。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片八千。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖燎猛,靈堂內(nèi)的尸體忽然破棺而出恋捆,到底是詐尸還是另有隱情,我是刑警寧澤重绷,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布沸停,位于F島的核電站,受9級(jí)特大地震影響昭卓,放射性物質(zhì)發(fā)生泄漏愤钾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一候醒、第九天 我趴在偏房一處隱蔽的房頂上張望能颁。 院中可真熱鬧,春花似錦倒淫、人聲如沸伙菊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)占业。三九已至绒怨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谦疾,已是汗流浹背南蹂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留念恍,地道東北人六剥。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像峰伙,于是被迫代替她去往敵國(guó)和親疗疟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,755評(píng)論 22 665
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • ▼ 從前慢 從前的日色變得慢 車(chē)店诗,馬,郵件都慢 一生只夠愛(ài)一個(gè)人 從前的鎖也好看 鑰匙精美有樣子 你鎖了人家就懂了...
    偶飾唯維閱讀 276評(píng)論 0 1
  • 昨天音榜,我們談到了公交車(chē)的安全感庞瘸,今天,我就去坐了一趟公交赠叼。發(fā)現(xiàn)了很多有意思的東西擦囊。上車(chē)的時(shí)候,我發(fā)現(xiàn)自己既沒(méi)有交通...
    茶山閱讀 488評(píng)論 0 1
  • 思考嘴办!思考瞬场! 任何一個(gè)人都會(huì)思考,也都在思考涧郊,也就是說(shuō)我們的大腦基本都在工作泌类。可人與人之間的差距還是從大腦的思考開(kāi)...
    耕耘生活閱讀 1,659評(píng)論 10 15