因为用到binding,所以需要在项目下的build.gradle文件中添加:


android {compileSdk 32....buildFeatures{dataBinding = trueviewBinding = true}
}

一: 采用 BottomNavigation + Fragment (分为上下两部分)

效果如下:

实现步骤:

1. 在 activity_main.xml 文件中编写基本布局


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/colorBackground"><FrameLayoutandroid:id="@+id/main_container" android:layout_width="match_parent"android:layout_height="match_parent"/><com.google.android.material.bottomnavigation.BottomNavigationViewandroid:id="@+id/bottom_Navigation_bar"android:layout_width="match_parent"android:layout_height="56dp"app:labelVisibilityMode="labeled"android:layout_alignParentBottom="true"app:menu="@menu/my_navigation_items"/></RelativeLayout>

2. 创建一个menu文件,在该文件下创建menu资源文件。并命名为:my_navigation_items

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+id/bottom_zero"android:title="测试"android:icon="@mipmap/ic_launcher"/><item android:id="@+id/bottom_one"android:title="首页"android:icon="@mipmap/ic_launcher"/><item android:id="@+id/bottom_two"android:title="二页"android:icon="@mipmap/ic_launcher"/><item android:id="@+id/bottom_three"android:title="三页"android:icon="@mipmap/ic_launcher"/><item android:id="@+id/bottom_four"android:title="四页"android:icon="@mipmap/ic_launcher"/></menu>

3. 创建多个Fragment及其需要绑定的布局fragment_home.xml,写法相似,贴一例


class HomeFragment: Fragment() {private lateinit var _binding:FragmentHomeBindingprivate val binding get() = _bindingoverride fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {_binding = FragmentHomeBinding.inflate(layoutInflater,container,false)return binding.root}companion object{var instance: HomeFragment ? = nullget() {if (field == null) {field = HomeFragment()}return field}}}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/app_name"/>
</androidx.constraintlayout.widget.ConstraintLayout>

4. 基本布局已经完成,在MainActivity中加载HomeFragment


class MainActivity : AppCompatActivity() {private val TAG = " MainActivity "private lateinit var _binding : ActivityMainBindingprivate val binding get() = _bindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)_binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)/*** 打开默认第一页* FragmentCreator.getFragment(FragmentCreator.INDEX_TOP0),因为涉及多个* 页面(Fragment),所以对其进行封装,获取实例,后面给出代码*/switchFragment(FragmentCreator.getFragment(FragmentCreator.INDEX_TOP0))// 监听事件initListener()}// 切换Fragment, 传入Fragment实例参数private fun switchFragment(fragment: Fragment?) {val supportFragmentManager = supportFragmentManagerval transaction = supportFragmentManager.beginTransaction()transaction.replace(R.id.main_container, fragment!!)transaction.commit()}// 监听事件private fun initListener() {// 监听底部导航栏的点击事件binding.bottomNavigationBar.setOnItemSelectedListener {when(it.itemId){R.id.bottom_zero -> {switchFragment(FragmentCreator.getFragment(FragmentCreator.INDEX_TOP0))logD(TAG,"zero")true}R.id.bottom_one -> {switchFragment(FragmentCreator.getFragment(FragmentCreator.INDEX_TOP1))logD(TAG,"one")true}R.id.bottom_two -> {switchFragment(FragmentCreator.getFragment(FragmentCreator.INDEX_TOP2))logD(TAG,"two")true}R.id.bottom_three -> {switchFragment(FragmentCreator.getFragment(FragmentCreator.INDEX_TOP3))logD(TAG,"three")true}else -> {switchFragment(FragmentCreator.getFragment(FragmentCreator.INDEX_TOP4))logD(TAG,"four")true}}}}
}

封装,获取Fragment实例


import androidx.fragment.app.Fragment
import com.isply.layoutviewpager.ui.fragment.HomeFragment
import com.isply.layoutviewpager.ui.fragment.Test
import com.isply.layoutviewpager.ui.fragment.Top2Fragment
import com.isply.layoutviewpager.ui.fragment.Top3Fragment
import com.isply.layoutviewpager.ui.fragment.Top4Fragmentclass FragmentCreator {companion object{const val INDEX_TOP0 = 0const val INDEX_TOP1 = 1const val INDEX_TOP2 = 2const val INDEX_TOP3 = 3const val INDEX_TOP4 = 4private val top0: Test by lazy {Test()}private val top1: HomeFragment by lazy {HomeFragment()  }private val top2: Top2Fragment by lazy {Top2Fragment()}private val top3: Top3Fragment by lazy {Top3Fragment()}private val top4: Top4Fragment by lazy {Top4Fragment()}fun getFragment(index: Int): Fragment?{when(index){INDEX_TOP0 -> {return top0}INDEX_TOP1 -> {return top1}INDEX_TOP2 -> {return top2}INDEX_TOP3 -> {return top3}INDEX_TOP4 -> {return top4}}return null}}
}

出现的问题:

1. 当底部导航栏的item数目大于3的时候部分文字不显示

加上: app:labelVisibilityMode="labeled"

2. BottomNavigation使用@drawable的过程中出现红色

写@drawable的时候没有提示,并且出现红色,我刚开始以为是不支持
不过当补充完整的时候就正常,如下面将 drawable 目录下的 selected_color 添加上就行了

在原有的基础上继续完善

二: TabLayout + ViewPager2

实现效果如下:

有空再写吧

未完待续…

Android - 实现导航栏的几种方式相关推荐

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

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

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

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

  3. Android底部导航栏的四种实现

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

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

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

  5. 底部导航栏的几种实现方式

    概述 Android底部导航栏实现方式真的是太多了~在这里仅介绍几种实现方式~建议使用TabLayout +ViewPager ,TabLayout是Android Material Design中的 ...

  6. 21天学习之二(Android 10.0 SystemUI默认去掉底部导航栏的三种方法)

    活动地址:CSDN21天学习挑战赛 1.概述 在定制化开发中,在SystemUI的一些定制功能中,针对默认去掉底部导航栏的方法有好几种,StatusBar和DisplayPolicy.java中api ...

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

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

  8. 关于Android系统隐藏导航栏的两种方法

    关于Android系统隐藏导航栏的两种方法 在NXP的imx6q和全志的A40I上试过 1.frameworks/base/core/res/res/values/dimens.xml中修改 < ...

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

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

最新文章

  1. 分布式服务框架-原理与实践:14---流量控制-学习笔记(理论篇)
  2. 阿里巴巴业务平台事业部总负责人墙辉:加速构建国际电商体系
  3. vue异步数据 报错_vue中异步请求数据,异步请求还没完成,文件就执行了就会报错,怎么解决?...
  4. 初识FPGA CLB之LUT实现逻辑函数
  5. ibe加密原理_ibe 基于身份的IBE加密源代码,采用C++语言编写,能够运行。 Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...
  6. QQList列表功能实现
  7. 【语音处理】基于matlab GUI音频数据处理【含Matlab源码 1734期】
  8. 阿里软件测试工程师手把手教学——面试必问的 Linux 命令
  9. MQTT客户端程序的编写
  10. 如何让测试RFC2544更便捷——RFC2544测试实操
  11. Chrome和edge浏览器书签本地路径以及批量修改书签
  12. 基于sass的前端样式管理方案
  13. Cobbler 自动装机系统
  14. 《StereoDRNet: Dilated Residual StereoNet》
  15. 支持一对多脱机克隆,ORICO发布三款便携式硬盘对拷机 - 超能网
  16. css中背景图片路径问题
  17. 2011.5.17 西二在线见面会总结
  18. 虚荣和骄傲会让你跌得很惨
  19. Windows7下载IE浏览器11版本
  20. 旭元数艺:以科技创新的力量共度传统佳节

热门文章

  1. 【建议收藏】35个Spring Cloud 连环炮
  2. 2023北京智源大会亮点回顾 | 高性能计算、深度学习和大模型:打造通用人工智能AGI的金三角
  3. win11共享打印机修复工具V1.0 | 完美解决“Windows无法连接到打印机、找不到打印机”以及“操作无法完成错误0x00000bc4找不到打印机”问题!!!
  4. js读取excel数据后的时间格式转换
  5. 单片机原理及其应用(持续更新)
  6. js实现多个小球碰撞
  7. android emulator ps4,PS4 Simulator手机版
  8. 计算机多媒体教室维修登记册,湖北工业大学多媒体教室管理办法(试行).doc...
  9. kettle学习笔记
  10. Object-C---Swift之(四)强大的Switch