Kotlin-Android开发之BottomBar快速构建项目

前言:作为安卓开发的老手,最近用Kotlin开发还是有点不习惯,但是。。。好了,回归正题,这次带领大家使用bottombar+fragment快速构建一个项目的开始阶段。这次主要不是介绍bottomBar的使用,而是项目开发前奏的注意事项,比如fragment基类和activity基类的抽取,fragment工具类的建立等等,适合刚入手的小白使用,此次开发使用Kotlin语言。


效果预览图:

代码目录:


需要添加的依赖:

    //anko
    implementation "org.jetbrains.anko:anko:0.10.1"
    //bottom-bar
    implementation 'com.roughike:bottom-bar:2.3.1'

1、首先fragment基类的抽取,代码如下

BaseFragment.kt
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import org.jetbrains.anko.AnkoLogger
import org.jetbrains.anko.runOnUiThread
import org.jetbrains.anko.toast

/**
 * 所有fragment的基类
 */
abstract class BaseFragment: Fragment(),AnkoLogger{

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        init()
    }

    /**
     * fragment初始化
     */
    open protected fun init() {

    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return initView()
    }

    /**
     * 获取布局id
     */
    abstract fun initView(): View?

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        initListener()
        initData()
    }

    /**
     * 初始化数据
     */
    open protected fun initData() {

    }

    /**
     * adapter
     * listener
     */
    open protected fun initListener(){

    }

    open fun myToast(msg:String){
        context?.runOnUiThread { toast(msg) }
    }
}

2.Activity基类的抽取

BaseActivity.kt
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import org.jetbrains.anko.AnkoLogger
import org.jetbrains.anko.startActivity
import org.jetbrains.anko.toast

/**
 * 所有activity类的基类
 */
abstract class BaseActivity : AppCompatActivity(),AnkoLogger {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(getLayoutId())
        initListener()
        initData()
    }

    /*
     * 初始化数据
     */
    open protected fun initData() {
    }

    /**
     * adapter listener
     */
    open protected fun initListener() {
    }

    /**
     * 获取布局id
     */
    abstract fun getLayoutId(): Int

    open protected fun myToast(msg:String){
        runOnUiThread { toast(msg) }
    }

    inline fun <reified T:BaseActivity> startActivityAndFinish(){
        startActivity<T>()
        finish()
    }
}

3.fragment工具类

import com.fly.bottombardemo.R
import com.fly.flyplayer.base.BaseFragment
import com.fly.flyplayer.ui.fragment.*

class FragmentUtil private constructor(){//私有化构造方法
    val firstFragment by lazy { FirstFragment() }
    val secondFragment by lazy { SecondFragment() }
    val thirdFragment by lazy { ThirdFragment() }
    companion object {
        val fragmentUtil by lazy { FragmentUtil() }
    }

    /**
     * 根据tabid获取对应的fragment
     */
    fun getFragment(tabId:Int):BaseFragment?{
        when(tabId){
            R.id.tab_first -> return firstFragment
            R.id.tab_second -> return secondFragment
            R.id.tab_third -> return thirdFragment
        }
        return null
    }
}

4.新建三个Fragmen类继承自BaseFragment类,以第一个为例

FirstFragment.kt
import android.view.View
import com.fly.bottombardemo.R
import com.fly.flyplayer.base.BaseFragment

class FirstFragment:BaseFragment() {
    override fun initView(): View? {
        return View.inflate(context, R.layout.fragment_first, null)
    }
}

布局代码为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent">

    <TextView
        android:text="第一个"
        android:textColor="#000000"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

5.在Activity中使用BottomBar

MainActivity.kt

import com.fly.bottombardemo.R
import com.fly.flyplayer.base.BaseActivity
import com.fly.flyplayer.util.FragmentUtil
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : BaseActivity() {
    override fun getLayoutId(): Int {
        return R.layout.activity_main
    }

    override fun initListener() {
        //设置tab切换监听
        bottomBar.setOnTabSelectListener{
            // it 代表参数tabId
            val transaction = supportFragmentManager.beginTransaction()
            transaction.replace(R.id.container, FragmentUtil.fragmentUtil.getFragment(it)!!,it.toString())
            transaction.commit()
        }
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.activity.MainActivity">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <com.roughike.bottombar.BottomBar
        android:id="@+id/bottomBar"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_alignParentBottom="true"
        app:bb_tabXmlResource="@xml/bottombar_tabs" />

</LinearLayout>

然后再res目录下新建一个xml文件夹,然后在xml文件夹新建一个bottombar_tabs.xml文件

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <tab
        id="@+id/tab_first"
        icon="@mipmap/ic_bottom_home_icon"
        title="第一" />
    <tab
        id="@+id/tab_second"
        icon="@mipmap/ic_bottom_home_icon"
        title="第二" />
    <tab
        id="@+id/tab_third"
        icon="@mipmap/ic_bottom_home_icon"
        title="第三" />
</PreferenceScreen>

ok,完成!

发布了105 篇原创文章 · 获赞 74 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_32306361/article/details/103915588