自從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代碼:
- 刪除掉onCreate中的setContentView
- 重寫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é)果:
可以看到我們的功能已經(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è)置之后,再來看看運行效果:
如果點擊菜單鍵沒有反應(yīng)的話抽活,請刪除掉繼承自BaseActivity的activity中的setSupportActionBar這行代碼即可