Android---DslTabLayout实现底部导航栏

1. 在 Android 项目中引用 JitPack 库

\bullet AGP 8.+ 根目录的 settings.gradle

dependencyResolutionManagement {...repositories {...maven { url 'https://jitpack.io' }}
}

\bullet AGP 8.+ 根目录如果是  settings.gradle.kts 文件

dependencyResolutionManagement {...repositories {...maven { url = uri("https://jitpack.io") }}
}

\bullet AGP 8.- 根目录的 build.gradle

allprojects {repositories {...maven { url 'https://jitpack.io' }}
}

2. 添加依赖

 在APP目录中的 build.gradle

implementation("com.github.angcyo.DslTablayout:TabLayout:3.5.3")
implementation("com.github.angcyo.DslTablayout:ViewPager2Delegate:3.5.3")

3. 布局 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"android:orientation="vertical"tools:context=".dsltablayout.BottomNavActivity"><androidx.viewpager2.widget.ViewPager2android:id="@+id/view_pager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#D5D6D6"/><!-- app:tab_default_index="0" 默认选中第 0 个 tab,默认选中的索引值--><!-- app:tab_item_is_equ_width="true" 让所有的 tab 平分宽度,Item等宽--><!-- app:tab_select_color="#DD0000" 选中当前 tab 时,tab 里文本的颜色 --><!-- app:tab_text_view_id="@id/content" 要放入的 TextView 的 id, 为 tab_item.xml 里的 id 为 content 的TextView --><com.angcyo.tablayout.DslTabLayoutandroid:id="@+id/dsl_tab_layout"android:layout_width="match_parent"android:layout_height="50dp"app:tab_default_index="0"app:tab_convex_background="@color/white"app:tab_item_is_equ_width="true"app:tab_select_color="#DD0000"app:tab_text_view_id="@id/content"/>
</LinearLayout>

4. 底部 tab_item.xml 布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:gravity="center"><ImageViewandroid:id="@+id/icon"android:layout_width="23dp"android:layout_height="23dp"android:src="@drawable/selector_tab_video"/><TextViewandroid:id="@+id/content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="12sp"android:text="发现"/></LinearLayout>

5. 每个底部 tab 对应的 fragment

a. DiscoveryFragment

class DiscoveryFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_discovery, container, false)}companion object {fun newInstance(): DiscoveryFragment{val args = Bundle()val fragment = DiscoveryFragment()fragment.arguments = argsreturn fragment}}
}

b. fragment_discovery.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".fragment.DiscoveryFragment"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="25sp"android:text="发现界面"android:layout_gravity="center"/></FrameLayout>

 其它三个 Fragment(VideoFragment,CategoryFragment,MeFragment)类似。

6. Adapter

class BottomTabAdapter(fragmentActivity : FragmentActivity, private val count : Int): FragmentStateAdapter(fragmentActivity) {override fun getItemCount(): Int {return count}/*** position 是每个 Fragment 对应的下标*/override fun createFragment(position: Int): Fragment {return when(position){0 -> DiscoveryFragment.newInstance()1 -> VideoFragment.newInstance()2 -> CategoryFragment.newInstance()else -> MeFragment.newInstance()}}
}

7. MainActivity.kt。填充Fragment 和 TabLayout,实现底部导航

在APP目录中的 build.gradle 的 android 下添加 ViewBinding 的使用

android {...viewBinding{enable=true}
}
class MainActivity : AppCompatActivity() {private lateinit var binding : ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)// TODO 1初始化底部按钮(tab_item)并添加到 dslTabLayoutfor (i in bottomItemTitle.indices){//TODO TabItemBinding.inflate(layoutInflater)) 通过 ViewBinding 的方式,拿到 tab_item.xml 布局TabItemBinding.inflate(layoutInflater).apply {content.text = bottomItemTitle[i]icon.setImageResource(bottomItemIcon[i])// 将当前添加了 icon 和 content 的 tab_item 添加到 TabLayout 中binding.dslTabLayout.addView(root)}}// TODO 2ViewPager + Fragmentbinding.viewPager.offscreenPageLimit = bottomItemTitle.sizebinding.viewPager.adapter = BottomTabAdapter(this, bottomItemTitle.size)// TODO 3将 ViewPager 中的 Fragment 与 底部的 Tab 绑定ViewPager2Delegate.install(binding.viewPager, binding.dslTabLayout, false)}companion object{// TODO 底部 item 的标题private val bottomItemTitle = listOf("发现","视频","分类","我的")// TODO 底部 item 的图标private val bottomItemIcon = listOf(R.drawable.selector_tab_discovery,R.drawable.selector_tab_video,R.drawable.selector_tab_category,R.drawable.selector_tab_me)}
}

完整项目

链接 DslTabLayout+ViewPager2+Fragment 实现底部导航栏
提取码:ei9o

如果向想通过Android原生的 BottomNavigationView+Viewpager2+Fragment 实现底部导航栏,可以看这一篇帖子 Android---简易的底部导航栏

DslDslTabLayout 官网 : https://github.com/angcyo/DslTabLayout

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471777.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Windows】MacOS制作纯净版Windows10安装U盘

方法一、在window系统中更新win10&#xff08;不更新引导程序&#xff09; cp -rp /Volumes/Windows10专业版\ 64位/* /Volumes/WIN10/https://baijiahao.baidu.com/s?id1760695844372493842&wfrspider&forpc 方法二、在window系统中更新win10&#xff08;更新引导程…

threejs之使用shader实现雷达扫描

varying vec2 vUv; uniform vec3 uColor; uniform float uTime;mat2 rotate2d(float _angle){return mat2(cos(_angle),-sin(_angle),sin(_angle),cos(_angle)); }void main(){vec2 newUv rotate2d(uTime*6.18)*(vUv-0.5);float angle atan(newUv.x,newUv.y);// 根据uv坐标获…

STM32——OLED菜单(二级菜单)

文章目录 一.补充二. 二级菜单代码 简介&#xff1a;首先在我的51 I2C里面有OLED详细讲解&#xff0c;本期代码从51OLED基础上移植过来的&#xff0c;可以先看完那篇文章&#xff0c;在看这个&#xff0c;然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

代码随想录算法训练营DAY18 | 二叉树 (5)

一、LeetCode 513 找树左下角的值 题目链接&#xff1a;513.找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/ 思路一&#xff1a;递归回溯全局变量比深度。 class Solution {int Max_depth 0;int result 0;public int findBottomLeftValue(TreeNo…

前端工程化面试题 | 10.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ES入门知识点总结

目录 倒排索引 倒排索引 Elasticsearch的倒排索引是一种数据结构&#xff0c;用于加快基于文本的搜索操作。它的主要优势在于能够快速找到包含特定单词的文档。 倒排索引的构建过程如下&#xff1a; 文档分词&#xff1a;将文档内容分割成单独的词&#xff08;或者更小的词元…

Javaweb基础-会话

会话&#xff1a; 会话管理&#xff1a;Cookie和Session配合解决 cookie是在客户端保留少量数据的技术,主要通过响应头向客户端响应一些客户端要保留的信息 session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息 cookie和session配合记录…

一文分清OMS、CMS、PMS、TMS、IM、BI、BPMS、SCRM、DSS等B端系统

继5月22日发布一文分清OA、CRM、ERP、MES、HRM、SCM、WMS、KMS等后&#xff0c;很多老铁又给我推荐了其他系统&#xff0c;贝格前端工场这次再撰一文&#xff0c;介绍这些系统。 之前文章&#xff1a; 一文分清OA、CRM、ERP、MES、HRM、SCM、WMS、KMS等 1、OMS系统 OMS系统是…

吐血整理!操作系统【处理机调度】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 基本概念1.1 总览1.2 什么是调度1.2.1 调度1.2.2 处理机调度 1.3 调度的三个层次1.3.1 高级调度1.3.2 中级调度&#xff08;内存调度&#xff09;1.3.3 低级调度&#xf…

A. Desorting

链接 : Problem - A - Codeforces 题意 : 思路 : 先判断序列是否排好序 &#xff0c; 不是排好序的&#xff0c;直接输出0即可&#xff0c;排好序的 : 先求出相邻元素之间的最小间隔&#xff0c;因为&#xff0c;要使有序非递减序列&#xff0c;变得不排序&#xff0c;…

联想拯救者:截屏就高亮,字都不清楚

截屏老是这样 改显示设置 关闭这个HDR&#xff0c; 就可以了 了解了一下HDR: HDR简单来说就是一种提高影像亮度和对比度的处理技术&#xff0c;它可以将每个暗部的细节变亮&#xff0c;暗的地方更暗&#xff0c;丰富更多细节色彩&#xff0c;让电影&#xff0c;图片都能呈现出…

C/C++重点解析——内存管理

1. C/C内存分布 我们先来看一段代码和其相关问题&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd"…