Android-4 Kotlin封裝Toolbar

上篇文章實現(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)ActivityFragment繼承接口時,可按照需要來實現(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使用

ActivityFragment都可以按照需要來繼承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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容