Android 底部导航栏+页面切换
lzyprime 博客 (github)
更新时间: 2020.12.21
创建时间:2020.11.25
qq及邮箱:2383518170
kotlin & android 笔记
更新
2020.12.21 解决 “在item2页面点击返回键会返回item1, 而非退出” 问题
之前笔记里(android navigation组件)记录整个导航组件时, 其中关于自定义返回导航只是简单一提, 并用于在MainActivity
的回调里整体组织路由。
提供自定义返回导航 官网文档
给Item2, Item3
页面注册返回事件, addCallBack
用(LifecycleOwner, OnBackPressedCallback)
版本, 会检测生存期,在页面被销毁时自动删掉回调。OnBackPressedCallback
构造函数传入 Boolean
表示回调初始是否开启(isEnable
), 之后可以调用它的 setEnable
来改变状态。
// 仓库已经更新
class Item2Fragment: Fragment(R.layout.item2_fragment){override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)requireActivity().onBackPressedDispatcher.addCallback(this, object :OnBackPressedCallback(true){override fun handleOnBackPressed() {requireActivity().finish()}})}
}
原文:
λ:
# android bottom navigation demo
# 仓库地址: https://github.com/lzyprime/android_demos
# branch: bottom_navigationgit clone -b bottom_navigation https://github.com/lzyprime/android_demos
底部导航配合多页面切换是常见逻辑,微信,qq,抖音,淘宝等等,常见app里几乎都有这种设计。
底部导航栏涉及到图标和标题在点击时的变化(颜色,大小,选中与未选中图标变化)
而上方的页面切换有两个常用方案:
用之前说过的 navigation组件
ViewPager2
参考 使用 NavigationUI 更新界面组件。 会发现用navigation组件
实现这套东西时可以一行代码搞定。甚至在 创建新Android Activity
时提供了生成版本:
这本身就可以当个demo。包含了底部栏如何配置,NavHost怎么设置。而且其中的Fragment还有ViewModel
。
但有一个问题就是每次切换页面,Fragment都是重新构建的,就算数据可以在ViewModel
活着,但是其他状态还是需要自己维护,比如列表滑动位置。
所以改用ViewPager2
, 通过设置offscreenPageLimit
来缓存页面。ViewPager2
底层是RecyclerView
, 用来替代之前的ViewPager
, 尽力保持两版接口一致,同时解决之前遗留的很多棘手问题。
1. 底部导航栏:BottomNavigationView
- 创建新的
android Resource file
, 类型选择menu
。 添加menuItem
- 在
activity_main.xml
添加BottomNavigationView
控件,同时设置menu
参数,之前设置的menuItem
标题和图标会在底部栏直接显示。同时可以通过底部栏的itemIconTint
等参数,设置选中态与未选中态的区别
2. 页面切换:
方案1: navigation
添加
NavHost
。如 navigation组件 中方式,添加导航图与目的地。注意
id
与menu
中相同,navController
通过id
将导航图与底部栏链接
// MainActivity
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val navHostFragment = supportFragmentManager.findFragmentById(R.id.mainNavHost) as NavHostFragmentmainBtmNavView.setupWithNavController(navHostFragment.findNavController())}
}
点击底部栏便可以切换页面。
方案2: ViewPager2
点击第一页按钮,跳转新的Activity
,将页面上方替换为ViewPager2
, 其他不变。
ViewPager2
设置adapter
, 负责页面切换和组织(FragmentStateAdapter
)。ViewPager2
设置offscreenPageLimit
, 起到缓存作用ViewPager2
注册OnPageChangeCallback
,页面滑动切换时回调,相当于ViewPager
中OnPageChangeListener
。 页面切换完成时,设置底部导航栏对应切换。- 如果不想滑动切换页面, 设置
ViewPager2
的isUserInputEnabled = false
, 不必注册回调 - 底部导航栏设置点击事件,
ViewPager2
跳转对应页面。
打印log验证页面是否保活。
class SecondaryActivity : AppCompatActivity() {private val fragments = arrayOf(Item1Fragment(), Item2Fragment(), Item3Fragment())private val itemIds = arrayOf(R.id.item1, R.id.item2, R.id.item3)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_secondary)secondaryVP.adapter = object : FragmentStateAdapter(supportFragmentManager, lifecycle) {override fun getItemCount(): Int = fragments.sizeoverride fun createFragment(position: Int): Fragment = fragments[position]}// 页面预加载secondaryVP.offscreenPageLimit = fragments.size// 若不想滑动切换页面时设置//secondaryVP.isUserInputEnabled = falsesecondaryVP.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {override fun onPageSelected(position: Int) {secondaryBtmNavView.selectedItemId = itemIds[position]}})secondaryBtmNavView.setOnNavigationItemSelectedListener {secondaryVP.currentItem = itemIds.indexOf(it.itemId)true}}
}
Android 底部导航栏+页面切换相关推荐
- mui实现底部导航栏页面切换
1 问题描述 mui是一款最接近原生的框架,对于会使用的人来说十分的便捷易操作,但对于像笔者这样刚入门的小白可是十分的陌生和走了太多的弯路. 对于那些不懂的前端的人,或者是一些刚入门html的人,他们 ...
- Android底部导航栏切换页面填坑
** Android底部导航栏切换页面填坑 ** 这个效果的实现关键点就是给选项赋予两种状态,focused和normal,在主程序中用监听判断是否被选中,就给被选中的选项设focused为true, ...
- 转载:Android底部导航栏,三种风格和实现
原文出处 标题:Android底部导航栏,三种风格和实现 作者:阿飞__ 原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏 一.效果图展示 如果动 ...
- Android底部导航栏的三种风格实现
一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...
- php点击切换图片的底部导航,如何优雅地使用BottomNavigationView实现底部导航栏+fragment切换效果...
BottomNavigationView.jpeg 引言 之前总是使用RadioButton+ViewPager来实现底部导航栏+fragment切换效果,总是繁琐地还需要写ViewPager的适配器 ...
- Android底部导航栏+消息提醒
Android底部导航栏+消息提醒 最近想在网上找一些Android底部导航栏切换并能提供消息提醒的案例,虽然有很多案例但都不是我想要的.我就开始自己瞎研究了,废话不多说了,直接上代码. 1.先创建一 ...
- android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...
现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...
- Android底部导航栏最常用的两种写法
先来看看底部导航栏的效果 Android 底部导航栏有很多种写法,例如: RadioGroup , Tablayout, TabHost , LinearLayout + ImageView + T ...
- android 固定底部导航,如何设置android底部导航栏位置固定在android
请帮我设置底部导航栏位置固定在底部, ,因为我在输入editText字段时遇到问题,底部导航栏向上移动并覆盖其他领域如何设置android底部导航栏位置固定在android 代码: xmlns:and ...
最新文章
- VC++屏幕抓词的技术实现
- java jvm内存地址_深入Java虚拟机——JVM内存详解
- 我的世界进入离开服务器消息,我的世界暂时离开状态修改 人性化设定AFK
- lintcode刷题 14. 二分查找,迭代和二分法Python实现
- TensorFlow基础1——神经网络tutorial
- 饱和气压与温度的关系_饱和水蒸气压计算公式,看懂的赶紧来
- JS: 百度地图与腾讯/高德地图经纬度转换
- 【自制diy-U盘】经验分享
- 数据分析师,数据挖掘工程师和数据研发工程师有什么区别?
- Linux下 eclipse下载
- 什么样的公司程序员待遇好
- PHP微信扫码关注公众号并授权登录源码
- 跟它比,期货简直 Low 爆了!
- 取球游戏(C++)[堆]
- 【人工智能项目】机器学习中文垃圾邮件分类任务
- 全面解决Jenkins离线、安装插件失败
- 文献资源下载网址经验总结
- 杰理之杰理新一代蓝牙耳机芯片【篇】
- 光电测径仪测头工作原理方式
- html重置按钮代码用法,HTML Input Reset value用法及代码示例