DrawerLayout:Write Once,Run EveryWhere

自從Material Design出來之后田弥,各種各樣的控件也是讓人眼花繚亂涛酗,但是用的時候還是需要克制,比如Google在官方的Material Design Guideline中就建議內(nèi)容相同的列表不要使用Cardview偷厦,而是推薦使用普通的布局商叹,中間加上divider即可,避免給人一種分裂感只泼。

在使用DrawerLayout的時候剖笙,可能我們多個Activity中都需要用到,我們是不是每個Activity都需要新建為Navigation Drawer Activity呢辜妓,答案是:NO枯途。所以這次我們就來看看,如何“克制地”使用DrawerLayout

Write Once籍滴,Run Everywhere

新建Navigation Drawer Activity

首先我們新建一個Navigation Drawer Activity作為我們BaseActivity酪夷,布局文件如下:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <!--<include
        layout="@layout/app_bar_base_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
-->
    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

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

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

我們首先將Android studio自己生成的<include></include>注釋掉,換成代碼中的FrameLayout孽惰,接下來修改自動生成的BaseActivity代碼:

  1. 刪除掉onCreate中的setContentView
  1. 重寫setContentView函數(shù)

重寫后的函數(shù)如下:

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
   }
   override fun setContentView(layoutResID: Int) {
       //首先獲取帶有DrawerLayout的布局
       val drawer = layoutInflater.inflate(R.layout.activity_base_drawer, null) as DrawerLayout
       //然后獲取這個布局里面的FrameLayout晚岭,也就是我們剛才在xml中添加的FrameLayout
       val frameContainer = drawer.findViewById(R.id.frame_container) as FrameLayout
       //然后將子類的布局添加到FrameLayout中
       layoutInflater.inflate(layoutResID, frameContainer, true)
       //最后設(shè)置布局為DrawerLayout的布局
       setContentView(drawer)
       //下面就是一些設(shè)置DrawerLayout動作和點擊事件的代碼
       val toggle = ActionBarDrawerToggle(
               this, drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
       drawer.setDrawerListener(toggle)
       toggle.syncState()

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

       toolbar.setNavigationOnClickListener { view -> drawer.openDrawer(Gravity.START) }
   }

上面的代碼使用Kotlin寫的,順便提一句:

在今天凌晨的Google I/O 2017上勋功,Android Team已經(jīng)將Kotlin做為Android開發(fā)的"first-class"了坦报。

上面設(shè)置完之后,我們可以隨便新建一個Activity狂鞋,然后繼承BaseActivity即可片择。

class DrawerActivity : BaseDrawerActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.app_bar_base_drawer)
        fab.setOnClickListener { view -> Snackbar.make(view, "可以", Snackbar.LENGTH_SHORT).show() }
    }
}

來看看結(jié)果:


drawer-layout.gif

可以看到我們的功能已經(jīng)實現(xiàn)了,但是有一些小瑕疵:

Toolbar上面沒有菜單鍵骚揍,需要通過從屏幕左邊滑才能呼出Drawer

這個問題從我們上面的代碼中也體現(xiàn)出來了字管,在BaseActivity中并沒有將Drawer的操作與Toolbar聯(lián)系到一起,接下來我們就來添加代碼信不,讓Toolbar和Drawer聯(lián)系到一起嘲叔,添加到上面重寫的setContentView中相應(yīng)的位置

  //獲取Toolbar
  val toolbar = frameContainer.findViewById(R.id.toolbar) as Toolbar
        setSupportActionBar(toolbar)
  // 將Toolbar與Drawer的動作聯(lián)系起來
  val toggle = ActionBarDrawerToggle(
                this, drawer,toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
  //最后設(shè)置toolbar的點擊事件
  toolbar.setNavigationOnClickListener { view -> drawer.openDrawer(Gravity.START) }

經(jīng)過上面的設(shè)置之后,再來看看運行效果:


drawer-layout-new.gif

如果點擊菜單鍵沒有反應(yīng)的話抽活,請刪除掉繼承自BaseActivity的activity中的setSupportActionBar這行代碼即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硫戈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子下硕,更是在濱河造成了極大的恐慌丁逝,老刑警劉巖汁胆,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霜幼,居然都是意外死亡沦泌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門辛掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人释牺,你說我怎么就攤上這事萝衩。” “怎么了没咙?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵猩谊,是天一觀的道長。 經(jīng)常有香客問我祭刚,道長牌捷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任涡驮,我火速辦了婚禮暗甥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捉捅。我一直安慰自己撤防,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布棒口。 她就那樣靜靜地躺著寄月,像睡著了一般。 火紅的嫁衣襯著肌膚如雪无牵。 梳的紋絲不亂的頭發(fā)上漾肮,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天器予,我揣著相機與錄音痊剖,去河邊找鬼停撞。 笑死挣惰,一個胖子當(dāng)著我的面吹牛辆雾,可吹牛的內(nèi)容都是我干的访诱。 我是一名探鬼主播筛峭,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宛徊,長吁一口氣:“原來是場噩夢啊……” “哼崔梗!你這毒婦竟也來了夜只?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蒜魄,失蹤者是張志新(化名)和其女友劉穎扔亥,沒想到半個月后场躯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡旅挤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年踢关,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘茄。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡签舞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柒瓣,到底是詐尸還是另有隱情儒搭,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布芙贫,位于F島的核電站搂鲫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磺平。R本人自食惡果不足惜魂仍,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拣挪。 院中可真熱鬧擦酌,春花似錦、人聲如沸媒吗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闸英。三九已至锯岖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甫何,已是汗流浹背出吹。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辙喂,地道東北人捶牢。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像巍耗,于是被迫代替她去往敵國和親秋麸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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