BottomNavigationView +ViewPager2 搭建项目框架
布局文件
-
<?xml version="1.0" encoding="utf-8"?>
-
<layout xmlns:android="http://schemas.android.com/apk/res/android"
-
xmlns:app="http://schemas.android.com/apk/res-auto">
-
<data>
-
</data>
-
<androidx.constraintlayout.widget.ConstraintLayout
-
android:id="@ id/container"
-
android:layout_width="match_parent"
-
android:layout_height="match_parent">
-
<androidx.viewpager2.widget.ViewPager2
-
android:id="@ id/vp2_main"
-
android:layout_width="match_parent"
-
android:layout_height="0dp"
-
app:layout_constraintBottom_toTopOf="@id/bnv_main"
-
app:layout_constraintTop_toTopOf="parent"/>
-
<com.谷歌.android.material.bottomnavigation.BottomNavigationView
-
android:id="@ id/bnv_main"
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content"
-
app:labelVisibilityMode="labeled"
-
android:elevation="0dp"
-
app:layout_constraintBottom_toBottomOf="parent"
-
app:layout_constraintTop_toBottomOf="@ id/vp2_main"
-
app:menu="@menu/bottom_nav_menu" />
-
</androidx.constraintlayout.widget.ConstraintLayout>
-
</layout>
MainActiviy
-
-
class MainActivity : BaseActivity<ActivityMainBinding>() {
-
-
override fun getLayoutRes(): Int = R.layout.activity_main
-
-
// 项目Fragment 集合
-
private val fragments = mapOf<Int,Fragment>(
-
INDEX_HOME to HomeFragment(),
-
INDEX_COURSE to CourseFragment(),
-
INDEX_STUDY to StudyFragment(),
-
INDEX_MINE to MineFragment(),
-
)
-
-
override fun initView() {
-
super.initView()
-
-
mBinding.apply {
-
vp2Main.adapter = MainViewPagerAdapter(this@MainActivity,fragments)
-
-
BnvVp2Mediator(bnvMain,vp2Main){bnv,vp2 ->
-
vp2.isUserInputEnabled = false // 设置是否响应用户滑动
-
}.attach()
-
}
-
}
-
-
companion object{
-
const val INDEX_HOME = 0
-
const val INDEX_COURSE = 1
-
const val INDEX_STUDY = 2
-
const val INDEX_MINE = 3
-
}
-
}
-
/**
-
* ViewPager 的适配类
-
*/
-
class MainViewPagerAdapter(framentActivity: MainActivity, val fragments: Map<Int, Fragment>) :
-
FragmentStateAdapter(framentActivity){
-
override fun getItemCount(): Int = fragments.size
-
-
override fun createFragment(position: Int): Fragment = fragments[position] ?: error("请确保fragments数据源和 viewpager2的index匹配设置")
-
}
辅助类
BnvVp2Mediator 用于 ViewPager2 和 BottomNavigationView 之间进行绑定关联,以后可以在任何项目中一句代码进行两者之间的绑定。
-
class BnvVp2Mediator(
-
private val bnv: BottomNavigationView,
-
private val vp2: ViewPager2,
-
private val config: ((BottomNavigationView,ViewPager2) -> Unit)? = null
-
) {
-
-
// BottomNavigationView item 与 id 的对应关系
-
private val map = mutableMapOf<MenuItem,Int>()
-
-
init {
-
bnv.menu.forEachIndexed { index, item ->
-
map.put(item, index)
-
}
-
}
-
-
/**
-
* 绑定
-
*/
-
fun attach(){
-
config?.invoke(bnv,vp2)
-
// viewpager 页面滑动监听: 动态绑定 BottomNavigationView 的selectedItemId 属性
-
vp2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
-
override fun onPageSelected(position: Int) {
-
super.onPageSelected(position)
-
-
// 绑定 position 位置的 BottomNavigationView 菜单Id
-
bnv.selectedItemId = bnv.menu.getItem(position).itemId
-
}
-
})
-
// BottomNavigationView 的菜单点击事件 动态改变 viewpager 切换的页面
-
bnv.setOnNavigationItemSelectedListener { item ->
-
vp2.currentItem = map[item] ?: error("Bnv 的 item 的 ID ${item.itemId} 没有对应的 viewpager2 的元素")
-
true
-
}
-
}
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfaggk
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01