Android BottomNavigationView結(jié)合ViewPager實現(xiàn)底部導(dǎo)航欄步驟詳解
ViewPager2 介紹
ViewPager2 是基于 RecyclerView 重新編寫的 ViewPager,比原有的 ViewPager 具有很多優(yōu)勢。
關(guān)于 ViewPager2 的基本使用可以參考:https://developer.android.google.cn/training/animation/screen-slide-2?hl=zh-cn
第一步
編寫布局,這里使用 DataBinding 不熟悉的可以參閱其他資料。
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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=".MainActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
app:layout_constraintTop_toTopOf="parent"
/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bnv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/bottom_view"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>```
# 第二步編寫 Menu
```kotlin
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/A"
android:icon="@mipmap/ic_launcher"
android:title="A" />
<item
android:id="@+id/B"
android:icon="@drawable/ic_launcher_background"
android:title="B" />
</menu>
第三步編寫 Fragment
這里不展示代碼,我使用了 AS 的模板代碼創(chuàng)建了兩個 Fragment :AFragment、BFragment。
第四步編寫 ViewPager2 的Adapter
ViewPager2 使用 FragmentStateAdapter 作為其 Adapter。
class ViewPagerAdapter(fragmentActivity: FragmentActivity,private val fragments:Map<Int,Fragment>) :FragmentStateAdapter(fragmentActivity){
override fun getItemCount(): Int {
return fragments.size
}
override fun createFragment(position: Int): Fragment {
return fragments[position]!!
}
}
第五步關(guān)聯(lián) ViewPager2 和 BottomNavigationView
Activity 的代碼:
class MainActivity : AppCompatActivity() {
var binding:ActivityMainBinding?=null
private val fragments= mapOf<Int,Fragment>(
A to AFragment.newInstance("1","2"),
B to BFragment.newInstance("3","4")
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding=ActivityMainBinding.inflate(LayoutInflater.from(this))
setContentView(binding?.root)
binding?.apply {
vp2.adapter=ViewPagerAdapter(this@MainActivity,fragments)
BnvMediator(bnv, vp2) { bnv, vp2 ->
vp2.isUserInputEnabled = true//為false ViewPager2 不能滑動
bnv.itemIconTintList=null//顯示 BottomNavigationView 的圖標。
}.attach()
}
}
companion object{
private val A:Int=0
private val B:Int=1
}
}
關(guān)聯(lián)的工具類:
class BnvMediator(
private val bnv: BottomNavigationView,
private val vp2: ViewPager2,
private val config: ((bnv: BottomNavigationView, vp2: ViewPager2) -> Unit)? = null
) {
//存儲bottomNavigationView的menu的item和其自身position的對應(yīng)關(guān)系
private val map = mutableMapOf<MenuItem, Int>()
init {
//初始化bnv的item和index對應(yīng)關(guān)系
bnv.menu.forEachIndexed { index, item ->
map[item] = index
}
}
/**
* 關(guān)聯(lián)BottomNavigationView和ViewPager2的選擇關(guān)系
*/
fun attach() {
config?.invoke(bnv, vp2)
vp2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
bnv.selectedItemId = bnv.menu[position].itemId
}
})
bnv.setOnNavigationItemSelectedListener { item ->
vp2.currentItem = map[item] ?: error("沒有對應(yīng)${item.title}的ViewPager2的元素")
true
}
}
}
到此這篇關(guān)于Android BottomNavigationView結(jié)合ViewPager實現(xiàn)底部導(dǎo)航欄步驟詳解的文章就介紹到這了,更多相關(guān)Android BottomNavigationView底部導(dǎo)航欄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程之內(nèi)存溢出解決方案(OOM)實例總結(jié)
這篇文章主要介紹了Android編程之內(nèi)存溢出解決方案(OOM),結(jié)合實例實例總結(jié)分析了Android編程過程中常見的內(nèi)存溢出情況與對應(yīng)的解決方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
Android仿微信朋友圈實現(xiàn)滾動條下拉反彈效果
這篇文章主要為大家介紹了Android仿微信朋友圈實現(xiàn)滾動條下拉反彈效果,感興趣的小伙伴們可以參考一下2016-01-01
SimpleCommand實現(xiàn)上傳文件或視頻功能(四)
這篇文章主要介紹了SimpleCommand實現(xiàn)上傳文件或視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10

