当前位置: 首页 > news >正文

Android 使用TabLayout + ViewPager2 实现标签页的视图切换

学习笔记

步骤概览

  1. 添加依赖
  2. 创建布局文件
  3. 创建 ViewPager2 适配器
  4. 设置 TabLayoutViewPager2 的联动
  5. 自定义每个页面内容(Fragment)
  6. 自定义 TabLayout 样式(可选)

1. 添加依赖

首先,你需要在 build.gradle 文件中添加 TabLayoutViewPager2 的依赖。

 
dependencies {implementation 'com.google.android.material:material:1.6.0'  // TabLayoutimplementation 'androidx.viewpager2:viewpager2:1.0.0'  // ViewPager2
}

2. 创建布局文件

在布局文件中,使用 TabLayoutViewPager2 组件。TabLayout 用来显示标签页,而 ViewPager2 用来展示与标签页对应的页面。

假设你的布局文件是 activity_main.xml,你可以使用以下代码:

 
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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"tools:context=".MainActivity"><!-- TabLayout,显示顶部的标签 --><com.google.android.material.tabs.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabMode="fixed"app:tabGravity="fill"/><!-- ViewPager2,显示页面内容 --><androidx.viewpager2.widget.ViewPager2android:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@id/tabLayout" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

3. 创建 ViewPager2 适配器

ViewPager2 需要一个适配器来提供页面的内容,通常你会创建一个 FragmentStateAdapter(或者 FragmentPagerAdapter,但 FragmentStateAdapter 更常用且支持动态添加和删除页面)。

创建适配器类

你需要创建一个继承自 FragmentStateAdapter 的类,用于为每个页面提供一个 Fragment 实例。

假设我们有三个页面(Tab1, Tab2, Tab3),它们的内容分别是不同的 Fragment

 
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;public class MainActivity extends AppCompatActivity {private ViewPager2 viewPager;private TabLayout tabLayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = findViewById(R.id.viewPager);tabLayout = findViewById(R.id.tabLayout);// 设置 ViewPager2 的适配器MyFragmentStateAdapter adapter = new MyFragmentStateAdapter(this);viewPager.setAdapter(adapter);// 设置 TabLayout 和 ViewPager2 的联动new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {// 设置每个 Tab 的标题switch (position) {case 0:tab.setText("Tab 1");break;case 1:tab.setText("Tab 2");break;case 2:tab.setText("Tab 3");break;}}).attach();}// ViewPager2 的适配器public static class MyFragmentStateAdapter extends FragmentStateAdapter {public MyFragmentStateAdapter(@NonNull AppCompatActivity fragmentActivity) {super(fragmentActivity);}@NonNull@Overridepublic Fragment createFragment(int position) {// 根据 Tab 的位置返回对应的 Fragmentswitch (position) {case 0:return new TabFragment1();case 1:return new TabFragment2();case 2:return new TabFragment3();default:return new TabFragment1();}}@Overridepublic int getItemCount() {return 3;  // 总共3个页面}}
}

4. 创建 Fragment 页面内容

你需要为每个 Tab 页创建对应的 Fragment,每个 Fragment 可以包含不同的 UI 内容。

TabFragment1.java
 
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;public class TabFragment1 extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 加载 Tab 1 的布局return inflater.inflate(R.layout.fragment_tab1, container, false);}
}

5. 自定义 TabLayout 样式(可选)

你可以根据需要自定义 TabLayout 的外观,例如设置不同的选中颜色、未选中颜色、图标等。

在布局文件中自定义 TabLayout 样式:
 
<com.google.android.material.tabs.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabMode="fixed"app:tabGravity="fill"app:tabIndicatorColor="@android:color/holo_blue_light"  <!-- 指示器颜色 -->app:tabSelectedTextColor="@android:color/holo_blue_dark"  <!-- 选中文本颜色 -->app:tabTextColor="@android:color/darker_gray" />  <!-- 未选中文本颜色 -->

使用 Tab 图标:

你也可以为 TabLayout 的每个标签添加图标,而不仅仅是文本。

 
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {switch (position) {case 0:tab.setText("Tab 1");tab.setIcon(R.drawable.ic_tab1);break;case 1:tab.setText("Tab 2");tab.setIcon(R.drawable.ic_tab2);break;case 2:tab.setText("Tab 3");tab.setIcon(R.drawable.ic_tab3);break;}
}).attach();

总结

  • TabLayout 用于显示标签页,而 ViewPager2 用于显示每个标签页对应的页面内容。
  • 使用 FragmentStateAdapter 创建 ViewPager2 的适配器,并为每个页面返回相应的 Fragment
  • 使用 TabLayoutMediator 来将 TabLayout ViewPager2 关联起来,使它们联动。
  • 可以自定义 TabLayout 的外观,包括文本、颜色和图标等。

通过以上步骤,你可以轻松地在 Android 应用中实现 Tab 栏和视图分页的功能,提供平滑的标签页切换体验。

相关文章:

Android 使用TabLayout + ViewPager2 实现标签页的视图切换

学习笔记 步骤概览 添加依赖创建布局文件创建 ViewPager2 适配器设置 TabLayout 和 ViewPager2 的联动自定义每个页面内容&#xff08;Fragment&#xff09;自定义 TabLayout 样式&#xff08;可选&#xff09; 1. 添加依赖 首先&#xff0c;你需要在 build.gradle 文件中添…...

vue 项目实现阻止浏览器记住密码

​在各个浏览器中&#xff0c;登录输入密码一般都会弹出是否记住密码的功能&#xff0c;如果记住之后&#xff0c;会在各个密码框自动填充记住的密码&#xff0c;这无疑是一种不安全的操作&#xff0c;所以要实现禁用阻止浏览器记住密码的行为 查阅资料&#xff0c;也得到很多…...

7. 一分钟读懂“单例模式”

7.1 模式介绍 单例模式就像公司里的 打印机队列管理系统&#xff0c;无论有多少员工提交打印任务&#xff0c;大家的请求都汇总到唯一的打印管理中心&#xff0c;按顺序排队输出。这个中心必须全局唯一&#xff0c;避免多个队列出现资源冲突&#xff0c;保证打印任务井然有序。…...

28个炫酷的纯CSS特效动画示例(含源代码)

CSS是网页的三驾马车之一&#xff0c;是对页面布局的总管家&#xff0c;2024年了&#xff0c;这里列出28个超级炫酷的纯CSS动画示例&#xff0c;让您的网站更加炫目多彩。 文章目录 1. 涌动的弹簧效果2. 超逼真的3D篮球弹跳&#xff0c;含挤压弹起模态3. 鼠标放div上&#xff0…...

百问FB网络编程 - 主要函数介绍

6.3 网络编程主要函数介绍 下面全部函数的头文件都是 #include <sys/types.h> #include <sys/socket.h>6.3.1 socket函数 int socket(int domain, int type,int protocol);此函数用于创建一个套接字。 domain是网络程序所在的主机采用的通讯协族(AF_UNIX和AF_I…...

Unity类银河战士恶魔城学习总结(P155 More example on audio effects更多的音效细节)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节添加了更多的音效细节 音频管理器 AudioManager.cs 使得多个音效可以同时播放&#xff0c;注释掉以下代码 public void PlaySFX(in…...

【题解】—— LeetCode一周小结48

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结47 25.网络延迟时间 题目链接&#xff1a;743. 网络延迟时间 …...

040集——CAD中放烟花(CAD—C#二次开发入门)

效果如下&#xff1a; 单一颜色的烟花&#xff1a; 渐变色的火花&#xff1a; namespace AcTools {public class HH{public static TransientManager tm TransientManager.CurrentTransientManager;public static Random rand new Random();public static Vector3D G new V…...

一文理解多模态大语言模型——下

作者&#xff1a;Sebastian Raschka 博士&#xff0c; 翻译&#xff1a;张晶&#xff0c;Linux Fundation APAC Open Source Evangelist 编者按&#xff1a;本文并不是逐字逐句翻译&#xff0c;而是以更有利于中文读者理解的目标&#xff0c;做了删减、重构和意译&#xff0c…...

ROS2创建 base 包用于其他模块的参数配置和头文件依赖

Demo 背景 ROS2项目开发中存在以下需求&#xff1a;有多个包需要读取一些共同的配置项(以txt或者yaml形式存在&#xff09;&#xff0c;且依赖于一些公用的utils工具代码(C)。Solution: 创建一个 base_config 包来“存放” 配置文件和公用的头文件。gitee address: Gitee/CDal…...

自然语言处理期末试题汇总

建议自己做&#xff0c;写完再来对答案。答案可能存在极小部分错误&#xff0c;不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …...

前端热门面试题目(四)——计算机网路篇

计算机网络常见面试题&#xff1a; 计算机网络面试&#xff08;一&#xff09; 计算机网络面试&#xff08;二&#xff09; 计算机网络速成&#xff1a; 计算机网络速成一 计算机网络速成二 计算机网络速成三 2. HTTP 1.0 和 2.0 的区别 连接复用&#xff1a; HTTP/1.0 使用短连…...

kubenetes流水线实施清单

整体实施方案概述 创建命名空间&#xff08;Namespace&#xff09;&#xff1a;创建一个专用于 CI/CD 的命名空间 cicd。配置 Secrets&#xff1a; Git SSH 密钥&#xff08;分别为 Maven 和 npm 项目&#xff09;Docker Registry 凭证&#xff08;Kaniko&#xff09;SMTP 凭证…...

Redis4——持久化与集群

Redis4——持久化与集群 本文讲述了1.redis在内存占用达到限制后的key值淘汰策略&#xff1b;2.redis主从复制原理&#xff1b;3.redis的哨兵模式&#xff1b;4.redis集群模式。 1. 淘汰策略 设置过期时间 expire key <timeout>只能对主hash表中的键设置过期时间。 查…...

【LeetCode: 94. 二叉树的中序遍历 + 栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

Python系列 - MQTT协议

Python系列 - MQTT协议 资源连接 MQTT的介绍和应用场景的示例说明 一、什么是MQTT 百度关于MQTT的介绍如下&#xff1a; MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布订阅范式的消息协议。它工作在 TCP/IP协议之上&#xff0c;是为硬件性能低下的远程设…...

同时在github和gitee配置密钥

同时在github和gitee配置密钥 1. 生成不同的 SSH 密钥 为每个平台生成单独的 SSH 密钥。 # 为 GitHub 生成密钥&#xff08;默认文件路径为 ~/.ssh/github_id_rsa&#xff09; ssh-keygen -t rsa -b 4096 -C "your_github_emailexample.com" -f ~/.ssh/github_id_…...

Runway 技术浅析(六):文本到视频(Text-to-Video)

1. 核心组件与工作原理 1.1 自然语言处理&#xff08;NLP&#xff09; 1.1.1 文本解析与语义理解 文本到视频的第一步是将用户输入的自然语言文本解析为机器可理解的语义信息。Runway 使用预训练的 NLP 模型&#xff0c;如 GPT-3 和 BERT&#xff0c;这些模型通过大规模文本数…...

云计算vspere 安装过程

1 材料的准备 1 安装虚拟机 vmware workstation 2 安装esxi 主机 3 在esxi 主机上安装windows 2018 dns 服务器 4 在虚拟机上安装windows 2018 服务器 6 安装vcenter 5 登入界面测试 这里讲一下&#xff0c;由于部署vspere 需要在windows 2012 服务器上部…...

QT 实现QStackedWidget切换页面右移动画

1.实现效果 以下是一个QStackedWidget,放了两个QPushButton在上面,点击切换不同的界面。 为了方便查看动画特效,设置了每个界面的背景图片。 2.实现思路 首先截取当前界面的图片,渲染到一个QLabel上,然后设置QPropertyAnimation动画,动画的作用对象就是这个QLabel,不断…...

YimMenu:GTA5游戏增强工具从入门到精通完全指南

YimMenu&#xff1a;GTA5游戏增强工具从入门到精通完全指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...

Obsidian全功能日历:在笔记中打造你的专属时间管理系统

Obsidian全功能日历&#xff1a;在笔记中打造你的专属时间管理系统 【免费下载链接】obsidian-full-calendar Keep events and manage your calendar alongside all your other notes in your Obsidian Vault. 项目地址: https://gitcode.com/gh_mirrors/obs/obsidian-full-c…...

WZLBadge高级定制:从颜色位置到字体半径的完全自定义

WZLBadge高级定制&#xff1a;从颜色位置到字体半径的完全自定义 【免费下载链接】WZLBadge //An one-line tool to show styles of badge for UIView 项目地址: https://gitcode.com/gh_mirrors/wz/WZLBadge WZLBadge是一款功能强大的iOS徽章工具&#xff0c;能够帮助开…...

长期项目使用Taotoken聚合API的稳定性与容灾感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期项目使用Taotoken聚合API的稳定性与容灾感受 1. 项目背景与接入初衷 我们团队负责一个面向内部用户的中型知识问答系统&#…...

Zed与VSCode争议背后真相:性能瓶颈到底是谁的锅

别被骗了&#xff01;Zed比VS Code快&#xff1f;真正的原因让你哭笑不得&#xff01;本文深入分析开发者社区对Zed编辑器与VS Code的争议&#xff0c;澄清性能瓶颈的真相在于语言服务器协议(LSP)而非编辑器本身&#xff0c;揭示Zed真正的优势在于原生Vim模式和架构简洁性&…...

第11章:故障诊断与处理

第11章:故障诊断与处理 11.1 常见故障类型与原因 集群级故障 故障类型 症状 常见原因 集群Red 存在未分配的主分片 节点故障、磁盘满、分片损坏 集群Yellow 存在未分配的副本分片 节点不足、磁盘满、副本数过多 集群脑裂 多个Master节点 网络分区、Master配置错误 集群无响应…...

【ElevenLabs老挝文语音实战指南】:2024年唯一经实测验证的8步本地化语音合成落地方案

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;ElevenLabs老挝文语音合成的技术背景与本地化价值 ElevenLabs 作为全球领先的AI语音生成平台&#xff0c;长期聚焦于高保真、情感化多语言语音合成技术。尽管其支持语言列表持续扩展&#xff0c;老挝文&#x…...

联想笔记本BIOS解锁终极指南:一键解锁隐藏高级设置

联想笔记本BIOS解锁终极指南&#xff1a;一键解锁隐藏高级设置 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具&#xff0c;例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/gh_mirrors/le/L…...

Servlet 容器与过滤器 超详细讲解

目录 一、Servlet 容器(Servlet Container) 1. 是什么? 2. 核心作用(必须掌握) 3. Servlet 生命周期(容器全权控制) 4. 工作流程(HTTP 请求完整链路) 5. 总结一句话 二、过滤器(Filter) 1. 是什么? 2. 核心特点 3. 过滤器能做什么?(高频场景) 4. 过滤…...

随身移动文件工作站 金士顿高速移动固态系列

当下移动办公已成为职场人的常态&#xff0c;无论是商务会谈时给客户演示视频、设计文件&#xff0c;还是户外创作时调取海量素材&#xff0c;亦或是日常通勤中处理微信接收的各类文件&#xff0c;都离不开高效的文件存储与传输支持。但现实中的痛点却屡屡困扰着大家&#xff1…...