设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 父母亲存在的意义不是给予孩子舒适和富裕的生活,而是,当你想到你的父母时,你的内心会充满力量,会感受到温暖,从而拥有克服困难的勇气和能力,以此获得人生真正的乐趣和自由。晚安!

父母亲存在的意义不是给予孩子舒适和富裕的生活,而是,当你想到你的父母时,你的内心会充满力量,会感受到温暖,从而拥有克服困难的勇气和能力,以此获得人生真正的乐趣和自由。晚安!

查看: 1708|回复: 2

Android BottomNavigationView结合ViewPager实现底部导航栏步骤详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:205
  • 打卡月天数:0
  • 打卡总奖励:3233
  • 最近打卡:2023-08-27 07:19:29
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
387
主题
351
精华
0
金钱
4350
积分
758
注册时间
2022-12-24
最后登录
2025-5-31

发表于 2023-3-2 10:03:19 来自手机 | 显示全部楼层 |阅读模式
ViewPager2 介绍
ViewPager2 是基于 RecyclerView 重新编写的 ViewPager,比原有的 ViewPager 具有很多优势。
关于 ViewPager2 的基本使用可以参考:https://developer.android.google.cn/training/animation/screen-slide-2?hl=zh-cn
第一步
编写布局,这里使用 DataBinding 不熟悉的可以参阅其他资料。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layout>
  3.    <data>
  4.    </data>
  5.    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  6.        xmlns:app="http://schemas.android.com/apk/res-auto"
  7.        xmlns:tools="http://schemas.android.com/tools"
  8.        android:layout_width="match_parent"
  9.        android:layout_height="match_parent"
  10.        tools:context=".MainActivity">
  11.       <androidx.viewpager2.widget.ViewPager2
  12.           android:id="@+id/vp2"
  13.           android:layout_width="match_parent"
  14.           android:layout_height="match_parent"
  15.           android:orientation="horizontal"
  16.           app:layout_constraintTop_toTopOf="parent"
  17.           />
  18.       <com.google.android.material.bottomnavigation.BottomNavigationView
  19.           android:id="@+id/bnv"
  20.           android:layout_width="match_parent"
  21.           android:layout_height="wrap_content"
  22.           app:labelVisibilityMode="labeled"
  23.           app:layout_constraintBottom_toBottomOf="parent"
  24.           app:menu="@menu/bottom_view"
  25.           />
  26.    </androidx.constraintlayout.widget.ConstraintLayout>
  27. </layout>```
  28. # 第二步编写 Menu
  29. ```kotlin
  30. <?xml version="1.0" encoding="utf-8"?>
  31. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  32.     <item
  33.         android:id="@+id/A"
  34.         android:icon="@mipmap/ic_launcher"
  35.         android:title="A" />
  36.     <item
  37.         android:id="@+id/B"
  38.         android:icon="@drawable/ic_launcher_background"
  39.         android:title="B" />
  40. </menu>
复制代码
第三步编写 Fragment
这里不展示代码,我使用了 AS 的模板代码创建了两个 Fragment :AFragment、BFragment。
第四步编写 ViewPager2 的Adapter
ViewPager2 使用 FragmentStateAdapter 作为其 Adapter。
  1. class ViewPagerAdapter(fragmentActivity: FragmentActivity,private  val fragments:Map<Int,Fragment>) :FragmentStateAdapter(fragmentActivity){
  2.     override fun getItemCount(): Int {
  3.         return fragments.size
  4.     }
  5.     override fun createFragment(position: Int): Fragment {
  6.        return fragments[position]!!
  7.     }
  8. }
复制代码
第五步关联 ViewPager2 和 BottomNavigationView
Activity 的代码:
  1. class MainActivity : AppCompatActivity() {
  2.     var binding:ActivityMainBinding?=null
  3.     private val fragments= mapOf<Int,Fragment>(
  4.         A to AFragment.newInstance("1","2"),
  5.         B to BFragment.newInstance("3","4")
  6.     )
  7.     override fun onCreate(savedInstanceState: Bundle?) {
  8.         super.onCreate(savedInstanceState)
  9.         binding=ActivityMainBinding.inflate(LayoutInflater.from(this))
  10.         setContentView(binding?.root)
  11.         binding?.apply {
  12.             vp2.adapter=ViewPagerAdapter(this@MainActivity,fragments)
  13.             BnvMediator(bnv, vp2) { bnv, vp2 ->
  14.                 vp2.isUserInputEnabled = true//为false ViewPager2 不能滑动
  15.                 bnv.itemIconTintList=null//显示 BottomNavigationView 的图标。
  16.             }.attach()
  17.         }
  18.     }
  19.     companion object{
  20.         private val A:Int=0
  21.         private val B:Int=1
  22.     }
  23. }
复制代码
关联的工具类:
  1. class BnvMediator(
  2.     private val bnv: BottomNavigationView,
  3.     private val vp2: ViewPager2,
  4.     private val config: ((bnv: BottomNavigationView, vp2: ViewPager2) -> Unit)? = null
  5. ) {
  6.     //存储bottomNavigationView的menu的item和其自身position的对应关系
  7.     private val map = mutableMapOf<MenuItem, Int>()
  8.     init {
  9.         //初始化bnv的item和index对应关系
  10.         bnv.menu.forEachIndexed { index, item ->
  11.             map[item] = index
  12.         }
  13.     }
  14.     /**
  15.      * 关联BottomNavigationView和ViewPager2的选择关系
  16.      */
  17.     fun attach() {
  18.         config?.invoke(bnv, vp2)
  19.         vp2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
  20.             override fun onPageSelected(position: Int) {
  21.                 super.onPageSelected(position)
  22.                 bnv.selectedItemId = bnv.menu[position].itemId
  23.             }
  24.         })
  25.         bnv.setOnNavigationItemSelectedListener { item ->
  26.             vp2.currentItem = map[item] ?: error("没有对应${item.title}的ViewPager2的元素")
  27.             true
  28.         }
  29.     }
  30. }
复制代码
到此这篇关于Android BottomNavigationView结合ViewPager实现底部导航栏步骤详解的文章就介绍到这了,更多相关Android BottomNavigationView底部导航栏内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-2-26 10:21:03 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:2
  • 打卡月天数:0
  • 打卡总奖励:15
  • 最近打卡:2023-11-20 03:32:34
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
28
积分
6
注册时间
2023-8-3
最后登录
2023-11-20

发表于 2025-3-20 10:58:29 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表