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.mzph.cn/news/685979.shtml

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

相关文章

openclash无法访问 https://raw.githubusercontent.com

个人尝试&#xff1a; 1&#xff1a;尝试覆写设置“ -> ”规则设置“ -> ”自定义规则“ -> ”规则设置仍无法访问&#xff1b; 2&#xff1a;配置管理“ -> ”配置文件编辑“ -> ”左边区域添加规则&#xff0c;尝试后也无效。 解决方案&#xff1a; 1&#x…

单片机学习笔记---LED呼吸灯直流电机调速

目录 LED呼吸灯 直流电机调速 模型结构 波形 定时器初始化函数 中断函数 主程序 上一节讲了电机的工作原理&#xff0c;这一节开始代码演示&#xff01; 我们上一篇说Ton的时间长Toff时间短电机会快&#xff0c;Ton的时间短Toff时间长电机会慢 并且我们还要保证无论Ton和…

element-UI 组件 dialog 中 ref 获取不到元素

项目场景&#xff1a; vue3集成bpmn.js 渲染过程中&#xff0c;进行流程图查看 问题描述 dialog弹窗加载获取canvas中 加载不到&#xff0c;导致偶尔流程展示加载失败 原因分析&#xff1a; 提示&#xff1a;官方解释如下&#xff0c;主要就是获取的时候&#xff0c;组件没有…

【微服安全】OpenID Connect 简介:现代应用程序的身份验证

OpenID Connect (OIDC) 是一个建立在 OAuth 2.0 之上的开放身份验证协议。它简化了应用程序以一种标准化和可互操作的方式验证用户身份并获取其基本个人资料信息的方式。可以将其视为应用程序“知道你是谁”的一种安全方式&#xff0c;而无需你创建单独的帐户或透露你的密码。 …

【Git】常用命令

命令作用注意git -v查看 git 版本git init初始化 git 仓库git add 文件标识暂存某个文件文件标识以终端为起始的相对路径git add .暂存所有文件git commit -m ‘说明注释’提交产生版本记录每次提交&#xff0c;把暂存区内容快照一份git status查看文件状态 - 详细信息git stat…

qml之Control类型布局讲解,padding属性和Inset属性细讲

1、Control布局图 2、如何理解&#xff1f; *padding和*Inset参数如何理解呢&#xff1f; //main.qml import QtQuick 2.0 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQuick.Controls 1.4 import QtQml 2.12ApplicationWindow {id: windowvisible: …

Leetcode - 周赛384

目录 一&#xff0c;3033. 修改矩阵 二&#xff0c;3035. 回文字符串的最大数量 三&#xff0c;3036. 匹配模式数组的子数组数目 II 一&#xff0c;3033. 修改矩阵 这道题直接暴力求解&#xff0c;先算出每一列的最大值&#xff0c;再将所有为-1的区域替换成该列的最大值&am…

算法刷题:无重复字符的最长字串

无重复字符的最长字串 .题目链接题目详情算法原理题目解析滑动窗口定义指针进窗口判断出窗口更新结果 我的答案 . 题目链接 无重复字符的最长字串 题目详情 算法原理 题目解析 首先,为了使字符串遍历的更加方便,我们选择将字符串转换为数组 题目要求子串中不能有重复的字符…

知识图谱:py2neo将csv文件导入neo4j

文章目录 安装py2neo创建节点-连线关系图导入csv文件删除重复节点并连接边 安装py2neo 安装python中的neo4j操作库&#xff1a;pip install py2neo 安装py2neo后我们可以使用其中的函数对neo4j进行操作。 图数据库Neo4j中最重要的就是结点和边&#xff08;关系&#xff09;&a…

隐函数的求导【高数笔记】

1. 什么是隐函数&#xff1f; 2. 隐函数的做题步骤&#xff1f; 3. 隐函数中的复合函数求解法&#xff0c;与求导中复合函数求解法有什么不同&#xff1f; 4. 隐函数求导的过程中需要注意什么&#xff1f;

【Linux网络编程五】Tcp套接字编程(四个版本服务器编写)

【Linux网络编程五】Tcp套接字编程(四个版本服务器编写&#xff09; [Tcp套接字编程]一.服务器端进程&#xff1a;1.创建套接字2.绑定网络信息3.设置监听状态4.获取新连接5.根据新连接进行通信 二.客户端进程&#xff1a;1.创建套接字2.连接服务器套接字3.连接成功后进行通信 三…

深度学习的基本原理和算法

深度学习的基本原理、算法和神经网络的基本概念是人工智能领域中非常重要的部分&#xff0c;下面我将分别深入解释这些内容。 深度学习的基本原理 深度学习的基本原理在于使用深层神经网络来模拟人脑神经元的连接方式&#xff0c;从而实现对复杂数据的分析和处理。它依赖于大…

爱上JVM——常见问题(一):JVM组成

1 JVM组成 1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&…

mysql存储范式简记

范式与反范式&#xff0c;范式追求不同表中的不重复存储&#xff0c;反范式可以重复存储一张表里。每张表一定要有一个主键&#xff0c;自增主键只推荐用在非核心业&#xff0c;核心业务表推荐使用 UUID 或业务自定义主键&#xff0c;可以通过 JSON 数据类型进行反范式设计。 …

第三十三回 镇三山大闹青州道 霹雳火夜走瓦砾场-python分割字符串

黄信和刘知寨押解宋江和花荣向青州走&#xff0c;碰到了燕顺等三人来劫囚车&#xff0c;黄信逃走了&#xff0c;刘知寨被抓住&#xff0c;被花荣一刀杀了。 黄信把情况报给青州知府&#xff0c;派来了青州兵马秦统制&#xff0c;人称霹雳火的秦明。秦明与花荣打&#xff0c;花…

计算机二级之sql语言的学习(数据模型—概念模型)

概念模型 含义: 概念模型用于信息世界&#xff08;作用对象&#xff09;的建模&#xff0c;是实现现实世界到信息世界&#xff08;所以万丈高楼平地起&#xff0c;不断地学习相关的基础知识&#xff0c;保持不断地重复才能掌握最为基础的基础知识&#xff09;的概念抽象&#…

c++STL系列——(十三)总结

目录 引言 正文 结语 引言 经过一段时间的学习和探索&#xff0c;我的C STL系列博客终于迎来了结束的时刻。在这个系列中&#xff0c;我们深入了解了C标准模板库&#xff08;STL&#xff09;的核心组件、常用容器和算法&#xff0c;并探讨了它们的特性和适用场景。通过这一…

数据结构链表力扣例题AC(2)——代码以及思路记录

206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 AC方法1 struct ListNode* reverseList(struct ListNode* head) {if(head NULL)return NULL;struct ListNode* n1, *n2, *n3;n1 NULL;n2 head;n3 head->next;while…

错误处理 ssh登陆提示:server unexpectedly closed network connection

干了一天的活&#xff0c;因为对etc做权限操作&#xff0c;导致ssh不能连接&#xff0c;差点奔溃 记这次处理经验 因修改/etc/ssh权限导致的ssh不能连接异常解决方法 现象&#xff1a; $ssh XXX192.168.5.21 出现以下问题 Read from socket failed: Connectionreset by peer …

QtApplets-线程池

QtApplets-线程池 ​ 今天咱们稍微看下Qt的线程池。QThreadPool&#xff0c;浅浅搞一下。 文章目录 QtApplets-线程池QThreadPoolQThreadPool 与 QThread 区别替代方案Qt Concurrent QThreadPool 与 Qt Concurrent 区别Demo运行效果 ☞ 源码 关键字&#xff1a; Qt、QRunnable…