• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

BottomNavigationView +ViewPager2 搭建项目框架

武飞扬头像
小二李
帮助1

布局文件

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    xmlns:app="http://schemas.android.com/apk/res-auto">
  4.  
    <data>
  5.  
    </data>
  6.  
    <androidx.constraintlayout.widget.ConstraintLayout
  7.  
    android:id="@ id/container"
  8.  
    android:layout_width="match_parent"
  9.  
    android:layout_height="match_parent">
  10.  
    <androidx.viewpager2.widget.ViewPager2
  11.  
    android:id="@ id/vp2_main"
  12.  
    android:layout_width="match_parent"
  13.  
    android:layout_height="0dp"
  14.  
    app:layout_constraintBottom_toTopOf="@id/bnv_main"
  15.  
    app:layout_constraintTop_toTopOf="parent"/>
  16.  
    <com.谷歌.android.material.bottomnavigation.BottomNavigationView
  17.  
    android:id="@ id/bnv_main"
  18.  
    android:layout_width="match_parent"
  19.  
    android:layout_height="wrap_content"
  20.  
    app:labelVisibilityMode="labeled"
  21.  
    android:elevation="0dp"
  22.  
    app:layout_constraintBottom_toBottomOf="parent"
  23.  
    app:layout_constraintTop_toBottomOf="@ id/vp2_main"
  24.  
    app:menu="@menu/bottom_nav_menu" />
  25.  
    </androidx.constraintlayout.widget.ConstraintLayout>
  26.  
    </layout>
学新通

MainActiviy

  1.  
     
  2.  
    class MainActivity : BaseActivity<ActivityMainBinding>() {
  3.  
     
  4.  
    override fun getLayoutRes(): Int = R.layout.activity_main
  5.  
     
  6.  
    // 项目Fragment 集合
  7.  
    private val fragments = mapOf<Int,Fragment>(
  8.  
    INDEX_HOME to HomeFragment(),
  9.  
    INDEX_COURSE to CourseFragment(),
  10.  
    INDEX_STUDY to StudyFragment(),
  11.  
    INDEX_MINE to MineFragment(),
  12.  
    )
  13.  
     
  14.  
    override fun initView() {
  15.  
    super.initView()
  16.  
     
  17.  
    mBinding.apply {
  18.  
    vp2Main.adapter = MainViewPagerAdapter(this@MainActivity,fragments)
  19.  
     
  20.  
    BnvVp2Mediator(bnvMain,vp2Main){bnv,vp2 ->
  21.  
    vp2.isUserInputEnabled = false // 设置是否响应用户滑动
  22.  
    }.attach()
  23.  
    }
  24.  
    }
  25.  
     
  26.  
    companion object{
  27.  
    const val INDEX_HOME = 0
  28.  
    const val INDEX_COURSE = 1
  29.  
    const val INDEX_STUDY = 2
  30.  
    const val INDEX_MINE = 3
  31.  
    }
  32.  
    }
  33.  
    /**
  34.  
    * ViewPager 的适配类
  35.  
    */
  36.  
    class MainViewPagerAdapter(framentActivity: MainActivity, val fragments: Map<Int, Fragment>) :
  37.  
    FragmentStateAdapter(framentActivity){
  38.  
    override fun getItemCount(): Int = fragments.size
  39.  
     
  40.  
    override fun createFragment(position: Int): Fragment = fragments[position] ?: error("请确保fragments数据源和 viewpager2的index匹配设置")
  41.  
    }
学新通

辅助类

BnvVp2Mediator 用于 ViewPager2 和 BottomNavigationView 之间进行绑定关联,以后可以在任何项目中一句代码进行两者之间的绑定。
  1.  
    class BnvVp2Mediator(
  2.  
    private val bnv: BottomNavigationView,
  3.  
    private val vp2: ViewPager2,
  4.  
    private val config: ((BottomNavigationView,ViewPager2) -> Unit)? = null
  5.  
    ) {
  6.  
     
  7.  
    // BottomNavigationView item 与 id 的对应关系
  8.  
    private val map = mutableMapOf<MenuItem,Int>()
  9.  
     
  10.  
    init {
  11.  
    bnv.menu.forEachIndexed { index, item ->
  12.  
    map.put(item, index)
  13.  
    }
  14.  
    }
  15.  
     
  16.  
    /**
  17.  
    * 绑定
  18.  
    */
  19.  
    fun attach(){
  20.  
    config?.invoke(bnv,vp2)
  21.  
    // viewpager 页面滑动监听: 动态绑定 BottomNavigationView 的selectedItemId 属性
  22.  
    vp2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
  23.  
    override fun onPageSelected(position: Int) {
  24.  
    super.onPageSelected(position)
  25.  
     
  26.  
    // 绑定 position 位置的 BottomNavigationView 菜单Id
  27.  
    bnv.selectedItemId = bnv.menu.getItem(position).itemId
  28.  
    }
  29.  
    })
  30.  
    // BottomNavigationView 的菜单点击事件 动态改变 viewpager 切换的页面
  31.  
    bnv.setOnNavigationItemSelectedListener { item ->
  32.  
    vp2.currentItem = map[item] ?: error("Bnv 的 item 的 ID ${item.itemId} 没有对应的 viewpager2 的元素")
  33.  
    true
  34.  
    }
  35.  
    }
  36.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfaggk
系列文章
更多 icon
同类精品
更多 icon
继续加载