• Android 底部导航栏(一、BottomNavigationView+Menu+Fragment)


    现在常用的App主页都会有一个底部导航栏,根据需求也使用过好几种方法进行实现,于是想着还是总结一下,今天还写一个简单的BottomNavigationView方法来实现这个功能

    一、什么是BottomNavigationView?

    它是android原生的一个底部导航框架,一般和Fragment一起使用。

    二、实际操作

    xml布局:最外层的layout不用管,那是databinding框架的根布局,主要的布局FrameLayout来装载fragment列表,BottomNavigationView实现底部导航栏,最后监听绑定实现点击切换

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <layout xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools">
    4. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. android:background="@color/white"
    8. android:orientation="vertical">
    9. <androidx.appcompat.widget.AppCompatTextView //只是个文本
    10. android:id="@+id/nav_text"
    11. android:layout_width="match_parent"
    12. android:layout_height="wrap_content"
    13. android:layout_marginTop="20dp"
    14. android:gravity="center"
    15. android:padding="4dp"
    16. android:text="BottomNavigationView+Menu+Fragment"
    17. android:textColor="@color/black"
    18. android:textSize="18sp"
    19. android:textStyle="bold" />
    20. <FrameLayout
    21. android:id="@+id/fragment_container"
    22. android:layout_width="match_parent"
    23. android:layout_height="match_parent"
    24. android:layout_above="@id/nav_menu"
    25. android:layout_below="@id/nav_text" />
    26. <View //只是个分界线
    27. android:layout_width="match_parent"
    28. android:layout_height="0.3dp"
    29. android:layout_above="@id/nav_menu"
    30. android:background="@color/tab_color_false"/>
    31. <com.google.android.material.bottomnavigation.BottomNavigationView
    32. android:id="@+id/nav_menu"
    33. android:layout_width="match_parent"
    34. android:layout_height="wrap_content"
    35. android:layout_alignParentBottom="true"
    36. android:background="@color/white"
    37. app:menu="@menu/nav_menu"
    38. tools:layout_height="50dp" />
    39. </RelativeLayout>
    40. </layout>

    其中BottomNavigationView控价下的app:menu属性为BottomNavigationView增加item

    它是在menu文件下新增nav_menu布局,如何新建呢?看图

    然后选择menu类型,命名就用默认的menu就行了 ,然后

     就可以了,然后往里面加item

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
    3. <item
    4. android:id="@+id/navigation_home"
    5. android:icon="@drawable/yang_1"
    6. android:title="首页" />
    7. <item
    8. android:id="@+id/navigation_tools"
    9. android:icon="@drawable/yang_4"
    10. android:title="工具" />
    11. <item
    12. android:id="@+id/navigation_play"
    13. android:icon="@drawable/yang_5"
    14. android:title="娱乐" />
    15. <item
    16. android:id="@+id/navigation_relax"
    17. android:icon="@drawable/yang_2"
    18. android:title="放松" />
    19. <item
    20. android:id="@+id/navigation_user_center"
    21. android:icon="@drawable/yang_3"
    22. android:title="个人中心" />
    23. </menu>

    这样就把menu创建好了,接下来是Activity里面的代码:

    1. /**
    2. * author: LiXiang
    3. * date: 2022/6/28 8:48 下午
    4. * description:
    5. */
    6. class NavMenuActivity : BaseBindActivity<NavMenuActivityLayoutBinding>() {
    7. override val layout: Int
    8. get() = R.layout.nav_menu_activity_layout
    9. private lateinit var homeFragment: HomeFragment
    10. private lateinit var toolsFragment: ToolsFragment
    11. private lateinit var relaxFragment: RelaxFragment
    12. private lateinit var meFragment: MineFragment
    13. private lateinit var playFragment: PlayFragment
    14. private lateinit var fragments: Array<BaseFragment>
    15. private var mTextMessage: TextView? = null
    16. //监听Item
    17. private val mOnNavigationItemSelectedListener: BottomNavigationView.OnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    18. when (item.itemId) {
    19. R.id.navigation_home -> {
    20. replaceFragment(fragments[0], fragments[0].tag.toString())
    21. mTextMessage?.text = "第1个fragment"
    22. return@OnNavigationItemSelectedListener true
    23. }
    24. R.id.navigation_tools -> {
    25. replaceFragment(fragments[1], fragments[1].tag.toString())
    26. mTextMessage?.text = "第2个fragment"
    27. return@OnNavigationItemSelectedListener true
    28. }
    29. R.id.navigation_play -> {
    30. replaceFragment(fragments[2], fragments[2].tag.toString())
    31. mTextMessage?.text = "第3个fragment"
    32. return@OnNavigationItemSelectedListener true
    33. }
    34. R.id.navigation_relax -> {
    35. replaceFragment(fragments[3], fragments[3].tag.toString())
    36. mTextMessage?.text = "第4个fragment"
    37. return@OnNavigationItemSelectedListener true
    38. }
    39. R.id.navigation_user_center -> {
    40. replaceFragment(fragments[4], fragments[4].tag.toString())
    41. mTextMessage?.text = "第5个fragment"
    42. return@OnNavigationItemSelectedListener true
    43. }
    44. }
    45. false
    46. }
    47. override fun initView() {
    48. val navigation: BottomNavigationView = findViewById(R.id.nav_menu)
    49. mTextMessage = findViewById(R.id.nav_text)
    50. navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    51. navigation.itemIconTintList = null
    52. navigation.itemTextColor = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.black))
    53. homeFragment = HomeFragment()
    54. toolsFragment = ToolsFragment()
    55. relaxFragment = RelaxFragment()
    56. meFragment = MineFragment()
    57. playFragment = PlayFragment()
    58. fragments = arrayOf(homeFragment, toolsFragment, playFragment, relaxFragment, meFragment)
    59. fragments.forEach {
    60. addFragment(it, it.tag.toString())
    61. hideFragment(it)
    62. }
    63. showFragment(fragments[0])
    64. }
    65. //添加Fragment到FragmentList中
    66. private fun addFragment(fragment: Fragment, tag: String) {
    67. val fragmentManager = supportFragmentManager
    68. val transaction: FragmentTransaction = fragmentManager.beginTransaction()
    69. transaction.add(R.id.fragment_container, fragment, tag)
    70. transaction.commit()
    71. }
    72. // 清空fragmentList的所有Fragment,替换成新的Fragment,注意Fragment里面的坑
    73. private fun replaceFragment(fragment: Fragment, tag: String) {
    74. val fragmentManager = supportFragmentManager
    75. val transaction: FragmentTransaction = fragmentManager.beginTransaction()
    76. transaction.replace(R.id.fragment_container, fragment, tag)
    77. transaction.commit()
    78. }
    79. //把Fragment设置成显示状态,但是并没有添加到FragmentList中
    80. private fun showFragment(fragment: Fragment) {
    81. val fragmentManager = supportFragmentManager
    82. val transaction: FragmentTransaction = fragmentManager.beginTransaction()
    83. transaction.show(fragment)
    84. transaction.commit()
    85. }
    86. //把Fragment设置成显示状态,但是并没有添加到FragmentList中
    87. private fun hideFragment(fragment: Fragment) {
    88. val fragmentManager = supportFragmentManager
    89. val transaction: FragmentTransaction = fragmentManager.beginTransaction()
    90. transaction.hide(fragment)
    91. transaction.commit()
    92. }
    93. }

    代码很简单,先把fragment列表添加到FrameLayout容器里,默认展示第一个fragment,通过BottomNavigationView.OnNavigationItemSelectedListener 方法,实现了fragment的切换。

    展示效果:

     

    一些总结:

    1、 navigation.itemIconTintList = null 这行代码不可缺少,不然你的导航栏的item图片会很丑,这行代码,可以让你的图片正常展示,因为默认的menu有个很丑的类似于蒙层的感觉。

    2、navigation.itemTextColor = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.black)) 这个是设置item的文本颜色

  • 相关阅读:
    TiDB Data Migration 查询状态
    Python Packaging & Distribution
    Java核心——面向对象编程(下)接口
    C++阶段05笔记03【C++提高编程资料(string容器、vector容器、deque容器、stack容器)】
    Mac 取消系统更新的红点——强迫症晚期患者
    input改造文件上传,el-table的改造,点击上传,拖拽上传,多选上传
    Windows使用ssh远程连接(虚拟机)Linux(Ubuntu)的方法
    Hinton等谈深度学习十年;PyTorch落地Linux基金会的影响;机器学习界的“GitHub”|AI系统前沿动态
    前端大容量存储方案IndexedDB
    企业架构LNMP学习笔记26
  • 原文地址:https://blog.csdn.net/LoveFHM/article/details/125498372