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里几乎都有这种设计。

底部导航栏涉及到图标和标题在点击时的变化(颜色,大小,选中与未选中图标变化)

而上方的页面切换有两个常用方案:

  1. 用之前说过的 navigation组件

  2. 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组件 中方式,添加导航图与目的地。

  • 注意idmenu中相同,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,页面滑动切换时回调,相当于ViewPagerOnPageChangeListener。 页面切换完成时,设置底部导航栏对应切换。
  • 如果不想滑动切换页面, 设置 ViewPager2isUserInputEnabled = 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 底部导航栏+页面切换相关推荐

  1. mui实现底部导航栏页面切换

    1 问题描述 mui是一款最接近原生的框架,对于会使用的人来说十分的便捷易操作,但对于像笔者这样刚入门的小白可是十分的陌生和走了太多的弯路. 对于那些不懂的前端的人,或者是一些刚入门html的人,他们 ...

  2. Android底部导航栏切换页面填坑

    ** Android底部导航栏切换页面填坑 ** 这个效果的实现关键点就是给选项赋予两种状态,focused和normal,在主程序中用监听判断是否被选中,就给被选中的选项设focused为true, ...

  3. 转载:Android底部导航栏,三种风格和实现

    原文出处 标题:Android底部导航栏,三种风格和实现 作者:阿飞__ 原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏 一.效果图展示 如果动 ...

  4. Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

  5. php点击切换图片的底部导航,如何优雅地使用BottomNavigationView实现底部导航栏+fragment切换效果...

    BottomNavigationView.jpeg 引言 之前总是使用RadioButton+ViewPager来实现底部导航栏+fragment切换效果,总是繁琐地还需要写ViewPager的适配器 ...

  6. Android底部导航栏+消息提醒

    Android底部导航栏+消息提醒 最近想在网上找一些Android底部导航栏切换并能提供消息提醒的案例,虽然有很多案例但都不是我想要的.我就开始自己瞎研究了,废话不多说了,直接上代码. 1.先创建一 ...

  7. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

  8. Android底部导航栏最常用的两种写法

    先来看看底部导航栏的效果 Android 底部导航栏有很多种写法,例如: RadioGroup , Tablayout, TabHost  , LinearLayout + ImageView + T ...

  9. android 固定底部导航,如何设置android底部导航栏位置固定在android

    请帮我设置底部导航栏位置固定在底部, ,因为我在输入editText字段时遇到问题,底部导航栏向上移动并覆盖其他领域如何设置android底部导航栏位置固定在android 代码: xmlns:and ...

最新文章

  1. VC++屏幕抓词的技术实现
  2. java jvm内存地址_深入Java虚拟机——JVM内存详解
  3. 我的世界进入离开服务器消息,我的世界暂时离开状态修改 人性化设定AFK
  4. lintcode刷题 14. 二分查找,迭代和二分法Python实现
  5. TensorFlow基础1——神经网络tutorial
  6. 饱和气压与温度的关系_饱和水蒸气压计算公式,看懂的赶紧来
  7. JS: 百度地图与腾讯/高德地图经纬度转换
  8. 【自制diy-U盘】经验分享
  9. 数据分析师,数据挖掘工程师和数据研发工程师有什么区别?
  10. Linux下 eclipse下载
  11. 什么样的公司程序员待遇好
  12. PHP微信扫码关注公众号并授权登录源码
  13. 跟它比,期货简直 Low 爆了!
  14. 取球游戏(C++)[堆]
  15. 【人工智能项目】机器学习中文垃圾邮件分类任务
  16. 全面解决Jenkins离线、安装插件失败
  17. 文献资源下载网址经验总结
  18. 杰理之杰理新一代蓝牙耳机芯片【篇】
  19. 光电测径仪测头工作原理方式
  20. html重置按钮代码用法,HTML Input Reset value用法及代码示例

热门文章

  1. 运营商,我看未必成为夕阳行业
  2. bp神经网络需要多少样本,bp神经网络训练时间
  3. 正交频分复用中的正交问题
  4. html文本框后面紧挨着按钮,HTMLbody标签中的相关标签2
  5. UT-Exynos4412 三星ARM四核旗舰开发平台android4.0体验-5联通3G功能调试支持
  6. C# socket通信 接收缓冲区大小设置,以及粘包问题的解决
  7. Mybatis insert、update 、delete返回值
  8. 有道笔记在Ubuntu上的安装
  9. 多线程(一)——委托与多线程
  10. 【软件测试】接口测试用例和报告模板