首先需要一個fragment數(shù)組來管理
private val fragmentArray = listOf(
HomeFragment(),
MessageCenterFragment(),
UserCenterFragment()
)
用一個實例來記錄當(dāng)前的fragment,還有定義對應(yīng)數(shù)量的tab實例
private var currentFrag: Fragment? = null
private lateinit var tabHome: TabLayout.Tab
private lateinit var tabMessage: TabLayout.Tab
private lateinit var tabUser: TabLayout.Tab
初始化布局:
private fun initTabLayout() {
// 實例初始化
tabHome = tab_layout.newTab().setCustomView(createTabItem("首頁", R.drawable.sel_home_tab_order))
tabMessage = tab_layout.newTab().setCustomView(createTabItem("消息",R.drawable.selector_home_tab_message))
tabUser = tab_layout.newTab().setCustomView(createTabItem("我的", R.drawable.sel_home_tab_user))
//添加到tabLayout
tab_layout.addTab(tabOrder)
tab_layout.addTab(tabMessage)
tab_layout.addTab(tabUser)
// 添加監(jiān)聽事件
tab_layout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabReselected(tab: TabLayout.Tab?) {
selectedTab(tab)
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
}
override fun onTabSelected(tab: TabLayout.Tab?) {
selectedTab(tab)
}
})
// 默認(rèn)選中首頁
selectedTab(tabHome)
}
創(chuàng)建tab
private fun createTabItem(text: CharSequence?, iconSrc: Int?): View {
val view = layoutInflater.inflate(R.layout.home_tab_item, null)
view.findViewById<TextView>(R.id.home_tab_text).text = text
if (null != iconSrc) {
view.findViewById<ImageView>(R.id.home_tab_icon).setImageResource(iconSrc)
}
return view
}
選擇tab的函數(shù)勇垛,里面實現(xiàn)了兩個步驟
private fun selectedTab(tab: TabLayout.Tab?) {
// 1. 選擇tab
onTabItemSelected(tab?.position ?: 0)
// 2. 更新tab狀態(tài)
updateTabSelectedStatus(tab_layout, tab)
}
這個是選中函數(shù)
private fun onTabItemSelected(pos: Int) {
if (pos > fragmentArray.size) {
throw IllegalArgumentException("fragment is not ready")
}
val trans = supportFragmentManager.beginTransaction()
val fragment = fragmentArray[pos]
if (fragment == currentFrag)
return
if (currentFrag != null) {
trans.hide(currentFrag)
}
// 未添加過 進(jìn)行添加 添加過展示
if (!fragment.isAdded) {
trans.add(R.id.layout_content, fragment)
} else {
trans.show(fragment)
}
currentFrag = fragment
trans.commitAllowingStateLoss()
}
更新選中狀態(tài)
private fun updateTabSelectedStatus(container: TabLayout, selTab: TabLayout.Tab?) {
for (i in 0 until container.tabCount) {
val itemView = container.getTabAt(i)?.customView
val text = itemView?.findViewById<TextView>(R.id.home_tab_text)
val icon = itemView?.findViewById<ImageView>(R.id.home_tab_icon)
(i == selTab?.position).apply {
icon?.isSelected = this
text?.isSelected = this
}
}
}