上篇文章實現(xiàn)了Tab選項卡,那么本篇文章就封裝下Toolbar,至于Toolbar是什么,能做什么大家可以去看看D_clock愛吃蔥花的文章Android開發(fā):最詳細的 Toolbar 開發(fā)實踐總結(jié);部分設(shè)置我也是從文章里學(xué)到了,那么我們先來看代碼:
開發(fā)語言:Kotlin
Toolbar封裝
ToolbarManager接口
package com.vslimit.kotlindemo.ui
import android.support.v7.graphics.drawable.DrawerArrowDrawable
import android.support.v7.widget.Toolbar
import com.vslimit.kotlindemo.R
import com.vslimit.kotlindemo.activity.MainActivity
import com.vslimit.kotlindemo.extensions.ctx
import org.jetbrains.anko.appcompat.v7.onMenuItemClick
import org.jetbrains.anko.*
interface ToolbarManager {
val toolbar: Toolbar
var toolbarTitle: String
get() = toolbar.title.toString()
set(value) {
toolbar.title = value
}
fun enableHomeAsUp(up: () -> Unit) {
toolbar.navigationIcon = createUpDrawable()
toolbar.setNavigationOnClickListener { up() }
}
fun enableMenu(id: Int = R.menu.menu_home, up: () -> Unit) {
toolbar.inflateMenu(id)
toolbar.onMenuItemClick {
when (it!!.itemId) {
R.id.index -> toolbar.ctx.startActivity<MainActivity>()
else -> up()
}
true
}
}
fun hiddenMenu(redId: Int) {
toolbar.menu.findItem(redId).isVisible = false
}
private fun createUpDrawable() = DrawerArrowDrawable(toolbar.ctx).apply { progress = 1f }
}
kotlin中的接口與java 8 中的接口類似,接口允許方法有實現(xiàn),和抽象類的區(qū)別是,接口中的屬性不允許直接初始化,默認是abstract的。因此,在ToolbarManager中定義了幾個方法,當(dāng)Activity或Fragment繼承接口時,可按照需要來實現(xiàn)或擴展。
toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent" xmlns:toolbar="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
toolbar:title="Kotlin Demo"
toolbar:titleTextColor="@android:color/white"
android:layout_height="?attr/actionBarSize">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
ToolbarManager使用
Activity或Fragment都可以按照需要來繼承ToolbarManager,本文中使用Activity來繼承,首先在BaseActivity添加如下代碼:
BaseActivity
package com.vslimit.kotlindemo.activity
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentTransaction
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import com.vslimit.kotlindemo.R
import com.vslimit.kotlindemo.ui.ToolbarManager
import org.jetbrains.anko.AnkoLogger
import org.jetbrains.anko.find
/**
* Created by vslimit on 16/1/12.
*/
abstract class BaseActivity : AppCompatActivity(), ToolbarManager, AnkoLogger {
abstract val layoutResourceId: Int
override val toolbar by lazy { find<Toolbar>(R.id.toolbar) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(layoutResourceId)
}
override fun onResume() {
super.onResume()
}
override fun onPause() {
super.onPause()
}
override fun onDestroy() {
super.onDestroy()
}
override fun onStop() {
super.onStop()
}
fun switchContent(from: Fragment, to: Fragment) {
val fm: FragmentManager = supportFragmentManager
//添加漸隱漸現(xiàn)的動畫
val ft: FragmentTransaction = fm.beginTransaction()
if (!to.isAdded) {
// 先判斷是否被add過
ft.hide(from).add(R.id.frameLayout, to) // 隱藏當(dāng)前的fragment,add下一個到Activity中
} else {
ft.hide(from).show(to) // 隱藏當(dāng)前的fragment,顯示下一個
}
ft.commit()
}
fun initFragment(to: Fragment) {
val fm: FragmentManager = supportFragmentManager
//添加漸隱漸現(xiàn)的動畫
// val ft: FragmentTransaction = fm.beginTransaction()
fm.beginTransaction().add(R.id.frameLayout, to).commit()
}
open fun initTitle(title: String = "Kotlin Demo") {
toolbarTitle = title
}
open fun initBack() {
enableHomeAsUp { onBackPressed() }
}
open fun initHome() {
enableMenu {}
}
}
在具體的Activity中,比如MainActivity的布局中引入toolbar.xml
activity_main.xml
<include layout="@layout/toolbar" android:id="@+id/tool"/>
MainActivity
將title設(shè)置為首頁
initTitle("首頁")
DemoActivity
設(shè)置標(biāo)題與后退鍵
package com.vslimit.kotlindemo.activity
import android.os.Bundle
import com.vslimit.kotlindemo.R
import com.vslimit.kotlindemo.model.FragmentEnum
class DemoActivity(override val layoutResourceId: Int = R.layout.activity_demo) : BaseActivity() {
companion object {
val NAME = "DemoActivity:name"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
val name = intent.getStringExtra(NAME)
initFragment(FragmentEnum.valueOf(name).fragment)
}
initTitle("DemoActivity")
initBack()
}
}
效果圖如下:

S61217-123321.jpg
至此Toolbar封裝完成,如果有定制需求,可以在ToolbarManager中實現(xiàn),當(dāng)然了,Fragment也可以繼承ToolbarManager,具體的大家可以自己擴展下。
Toobar的代碼詳見:https://github.com/vslimit/kotlindemo