Android BottomNavigationView结合ViewPager实现底部导航栏步骤详解
作者:OnexTwo 发布时间:2021-09-01 00:42:38
标签:Android,BottomNavigationView,ViewPager,导航栏
ViewPager2 介绍
ViewPager2 是基于 RecyclerView 重新编写的 ViewPager,比原有的 ViewPager 具有很多优势。
关于 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 的模板代码创建了两个 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]!!
}
}
第五步关联 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
}
}
关联的工具类:
class BnvMediator(
private val bnv: BottomNavigationView,
private val vp2: ViewPager2,
private val config: ((bnv: BottomNavigationView, vp2: ViewPager2) -> Unit)? = null
) {
//存储bottomNavigationView的menu的item和其自身position的对应关系
private val map = mutableMapOf<MenuItem, Int>()
init {
//初始化bnv的item和index对应关系
bnv.menu.forEachIndexed { index, item ->
map[item] = index
}
}
/**
* 关联BottomNavigationView和ViewPager2的选择关系
*/
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("没有对应${item.title}的ViewPager2的元素")
true
}
}
}
来源:https://blog.csdn.net/qq_41105058/article/details/128852129


猜你喜欢
- java POI合并两个word文档有需要的可以将主函数中写死的地方改为一个Listimport java.io.FileInputStre
- 今天工作中遇到一个需求,就是获取 excel 里面的内容,并且把 excel 另存为 csv,因为本人以前未接触过,所以下面整理出来的代码均
- 学C#的原因其实挺简单的,因为一直对游戏挺感兴趣,查了下比较流行的游戏引擎Unity的主要开发语言是C#,所以就决定从C#入手,学学面向对象
- 本文为大家分享了一个简单的android左滑删除控件,供大家参考,具体内容如下import android.animation.ValueA
- 把char数组转换成String调用reverseStr()传入一个字符串"let’s"
- Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日
- //直接插入排序void DirectInsertionSort(int* arr, in
- 场景yitter-idgenerator 是基于雪花算法进行改造的分布式ID自增算法,集成时需要为每个服务设置唯一的机器号,才能保证生成的I
- 本文实例讲述了C#判断日期是否到期的方法,在C#程序开发中非常具有实用价值。分享给大家供大家参考之用。具体方法如下:一般在用户权限系统中,有
- 本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,具体如下:使用C#访问sqlite时,常会遇到多线程并发导致SQ
- 前言Mybatis真正强大的地方在于SQL映射语句,这也是它的魅力所在。相对于它强大的功能,SQL映射文件的配置却非常简单,我上篇文章语句讲
- 前言:小编引入的图片和文字描述都是来自于尚硅谷的视频讲解,在此感谢尚硅谷的老师,同时也结合 seata文档官方文档进行整合项目地址(gite
- **请注意!请注意!!!**今天讲给大家讲解非常“有用”的设计模式,解释器模式!!!设计模式有三大种类,一种是创建型模式,一种是结构型模式,
- 一、包装类概述Java有8种基本数据类型:整型(byte、short、int、long)、浮点型(float、double)、布尔型bool
- 这篇文章主要介绍了Java二分查找算法实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 一、前言首选,双轴快排也是一种快排的优化方案,在JDK的Arrays.sort()中被主要使用。所以,掌握快排已经不能够满足我们的需求,我们
- 一、概述1、事务ACID特性事务将一系列的工作视为一个工作单元,它具有 ACID 特性:A:Atomicity 不可分性 也就是说
- 一.mybatis的配置1.1 添加相应的jar包在lib文件夹下面添加mybatis的核心jar包以及依赖的jar包同在lib文件夹下面加
- 前言项目使用redis作为缓存数据,但面临着问题,比如,项目A,项目B都用到redis,而且用的redis都是一套集群,这样会带来一些问题。
- Filter过滤器和Listener * 详解Filter过滤器Filter的简介 对资源的访问进行过滤,相当于小区的保安,进去