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
0
投稿
猜你喜欢
- 一、前置说明本节大纲使用lombok插件的好处如何安装lombok插件使用lombok提高开发效率二、使用lombok插件的好处我们在jav
- 本文实例分析了C#中Action和Func的区别,有助于读者牢固掌握并对其准确使用。具体分析如下:先来看下面这段代码://测试使用的公共值i
- 首先是.select在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。其中要注意的细节:wrapper.s
- 组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系。个人理解:组合模式就
- 相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线void fitLine( InputArray points, Output
- 本文实例为大家分享了Java实现寻找迷宫出路的具体代码,供大家参考,具体内容如下项目名称寻找迷宫出路项目描述给定一个自定义迷宫,0表示能通过
- 本文实例讲述了C#4.0新特性的协变与逆变,有助于大家进一步掌握C#4.0程序设计。具体分析如下:一、C#3.0以前的协变与逆变如果你是第一
- Pom文件的依赖我们进入POM文件,首先是看到的是Pom文件中的parentparent是Spring Boot的框架版本控制中心<!
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- 将一个字符串转化成String[]数组,提供两种方法前言将字符串转化成数组提供两种方法:1.split("");2.to
- Failed to execute goal org.apache.maven.plugins:maven-resources-plugin
- 目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel直接上代码:一,POIPOI是apa
- 算法中递归的一个典型应用就是遍历目标文件夹,并把该文件夹下的所有文件和文件夹打印或显示出来,还可以递归计算出目标文件夹的总大小。本文即以实例
- Gradle修改默认的Build配置文件名Gradle默认使用build.gradle作为默认的配置文件文件名。如果我们在build.gra
- 本文为大家介绍了java图片添加水印实例代码,java实现水印还是非常方便的,水印可以是图片或者文字,具体内容如下package micha
- 实例如下:/** * 将一个list均分成n个list,主要通过偏移量来实现的 * @param source * @return */ p
- 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java
- 前言本文主要讲述如何在同一个窗体内,实现不同功能模块的页面切换。一、准备工作1.搭建一个简单的mvvm项目结构首先搭建一个简单的项目框架,然
- 1、检测权限因为dump系统lsass内存和sam注册表需要管理员权限,所以首先需要对当前进程上下文权限做判断。public static
- 背景数据之间两两趋势比较在数据分析应用中是非常常见的应用场景,如下所示:模拟考批次班级学生语文数学英语202302三年一班张小明130145