前言:作为安卓开发的老手,最近用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,完成!