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

Java 实现 Android ViewPager2 顶部导航:动态配置与高效加载指南

  1. Java 实现:明确使用的编程语言。
  2. Android ViewPager2:技术栈和核心组件。
  3. 顶部导航:功能点。
  4. 动态配置与高效加载指南:突出动态配置的灵活性和性能优化的重点。
    在 Android 中使用 Java 实现 ViewPager2TabLayout 的顶部导航也是完全可行的。以下是详细的实现步骤,使用 Java 编写代码。

实现步骤

1. 添加依赖

build.gradle 中添加 ViewPager2Material Design 依赖:

dependencies {implementation 'androidx.viewpager2:viewpager2:1.0.0'implementation 'com.google.android.material:material:1.4.0'
}

2. 定义页面数据

创建一个 Page 类来管理页面的标题和图标。

// Page.java
public class Page {private String title;private int icon;public Page(String title, int icon) {this.title = title;this.icon = icon;}public String getTitle() {return title;}public int getIcon() {return icon;}public static final Page[] pages = {new Page("Home", R.drawable.ic_home),new Page("Dashboard", R.drawable.ic_dashboard),new Page("Notifications", R.drawable.ic_notifications)};
}

3. 创建 Fragment

为每个页面创建对应的 Fragment

// Fragment1.java
public class Fragment1 extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_1, container, false);}
}// Fragment2.java
public class Fragment2 extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_2, container, false);}
}// Fragment3.java
public class Fragment3 extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_3, container, false);}
}

4. 创建适配器

使用 FragmentStateAdapter 动态加载 Fragment

// ViewPagerAdapter.java
public class ViewPagerAdapter extends FragmentStateAdapter {public ViewPagerAdapter(FragmentActivity fragmentActivity) {super(fragmentActivity);}@Overridepublic Fragment createFragment(int position) {switch (position) {case 0:return new Fragment1();case 1:return new Fragment2();case 2:return new Fragment3();default:throw new IllegalArgumentException("Invalid position");}}@Overridepublic int getItemCount() {return Page.pages.length;}
}

5. 设置 ViewPager2 和 TabLayout

MainActivity 中设置 ViewPager2TabLayout 的联动。

// MainActivity.java
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewPager2 viewPager = findViewById(R.id.viewPager);TabLayout tabLayout = findViewById(R.id.tabLayout);// 设置 ViewPager2 适配器viewPager.setAdapter(new ViewPagerAdapter(this));// 将 TabLayout 与 ViewPager2 联动new TabLayoutMediator(tabLayout, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {@Overridepublic void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {tab.setText(Page.pages[position].getTitle());tab.setIcon(Page.pages[position].getIcon());}}).attach();}
}

6. 布局文件

activity_main.xml 中定义布局,包含 TabLayoutViewPager2

<LinearLayout 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:orientation="vertical"><!-- 顶部导航 --><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="0dp"android:layout_weight="1"/></LinearLayout>

7. 扩展功能:动态添加页面

如果需要动态添加页面,可以修改 Page.pages 数组并通知适配器更新。

// 动态添加页面
Page[] newPages = Arrays.copyOf(Page.pages, Page.pages.length + 1);
newPages[newPages.length - 1] = new Page("Profile", R.drawable.ic_profile);
Page.pages = newPages;// 通知适配器更新
viewPager.getAdapter().notifyDataSetChanged();

优化后的优势

  1. 高效加载FragmentStateAdapter 确保 Fragment 实例的高效管理。
  2. 动态配置:通过 Page 类动态配置页面,避免硬编码。
  3. 代码简洁:使用 Java 的标准写法,逻辑清晰。
  4. 可扩展性:添加新页面只需修改 Page.pages 数组,无需修改核心逻辑。

示例:添加新页面

如果需要添加一个新页面,只需修改 Page.pages 数组:

public static final Page[] pages = {new Page("Home", R.drawable.ic_home),new Page("Dashboard", R.drawable.ic_dashboard),new Page("Notifications", R.drawable.ic_notifications),new Page("Profile", R.drawable.ic_profile) // 新增页面
};

然后在 ViewPagerAdapter 中处理新页面:

@Override
public Fragment createFragment(int position) {switch (position) {case 0:return new Fragment1();case 1:return new Fragment2();case 2:return new Fragment3();case 3:return new Fragment4(); // 新增页面default:throw new IllegalArgumentException("Invalid position");}
}

总结

通过以上步骤,使用 Java 实现了 ViewPager2TabLayout 的顶部导航。代码结构清晰,易于扩展和维护。无论是静态页面还是动态页面,都可以轻松实现高效的顶部导航。

相关文章:

Java 实现 Android ViewPager2 顶部导航:动态配置与高效加载指南

Java 实现&#xff1a;明确使用的编程语言。Android ViewPager2&#xff1a;技术栈和核心组件。顶部导航&#xff1a;功能点。动态配置与高效加载指南&#xff1a;突出动态配置的灵活性和性能优化的重点。 在 Android 中使用 Java 实现 ViewPager2 和 TabLayout 的顶部导航也是…...

Python :数据模型

一. 什么是数据模型&#xff1f; Python数据模型是Python对象系统的抽象&#xff0c;通过一组特殊方法​&#xff08;如__init__、__len__等&#xff09;和协议​&#xff08;如迭代协议、上下文管理协议&#xff09;&#xff0c;定义了对象如何与语言的内置功能&#xff08;如…...

idea超级AI插件,让 AI 为 Java 工程师

引言​ 用户可在界面中直接通过输入自然语言的形式描述接口的需求&#xff0c;系统通过输入的需求自动分析关键的功能点有哪些&#xff0c;并对不确定方案的需求提供多种选择&#xff0c;以及对需求上下文进行补充&#xff0c;用户修改确定需求后&#xff0c;系统会根据需求设…...

施磊老师c++笔记(五)

继承与多态-深入掌握oop语言最强大的机制 文章目录 继承与多态-深入掌握oop语言最强大的机制1.继承的基本意义2.派生类的构造过程3.重载,隐藏,覆盖4.虚函数, 静态绑定和动态绑定--面试重点5.虚析构函数--重点在于什么呢时候用6.再讨论虚函数和动态绑定7.理解多态到底是什么8.理…...

µCOS-III从入门到精通 第十四章(软件定时器)

参考教程&#xff1a;【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili 一、软件定时器简介 1、定时器的概念与种类 &#xff08;1&#xff09;定时器的概念&#xff1a;从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&…...

MySQL数据库复杂的增删改查操作

在前面的文章中&#xff0c;我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子&#xff0c;进行讲解一些较为复杂且现时需求的例子。 基础知识&#xff1a; 一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博…...

KCD 北京站丨Volcano 邀您畅聊云原生智能调度技术与应用

AI与云原生技术正以前所未有的速度改变着我们的世界&#xff0c;而云原生技术则如同一座坚实的桥梁&#xff0c;连接着传统IT与现代化的数字世界。当AI与云原生相遇&#xff0c;它们相互赋能&#xff0c;相互促进&#xff0c;为开发者们打开了一个全新的技术宇宙。 3 月 15 日&…...

BLEU评估指标

一、介绍 用于评估模型生成的句子和实际句子差异的指标&#xff0c;取值在[0,1]&#xff0c;匹配度高就距离1近&#xff0c;反之距离0近。这个指标计算代价小&#xff0c;容易理解&#xff0c;与语言无关&#xff0c;与人类评价结果高度相关。 BLEU主要基于n-gram匹配&#x…...

高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架

一、背景 在快节奏的开发周期中&#xff0c;如何确保接口质量&#xff1f;自动化测试是关键。通过构建标准化、可复用的测试框架&#xff0c;能显著提升测试效率与准确性&#xff0c;为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标&#xff1a; ● 实现快速、高效的接口测试…...

如何修复 Tauri 发布后程序运行时显示 `asset not found: index.html` 的问题

如何修复 Tauri 发布后程序运行时显示 asset not found: index.html 的问题 在使用 Tauri 发布应用程序时&#xff0c;如果运行时出现 asset not found: index.html 的错误&#xff0c;通常是因为 Tauri 无法找到或正确加载前端资源文件&#xff08;如 index.html&#xff09;…...

BSides Vancouver: 2018 (Workshop)

BSides Vancouver: 2018 (Workshop) 来自 <https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop,231/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23…...

rStar论文精读

论文简介 论文标题&#xff1a;《Mutual reasoning makes smaller LLMs stronger problem-solvers》 论文地址&#xff1a;https://arxiv.org/abs/2408.06195 录用会议&#xff1a;ICLR2025 背景与挑战 挑战1&#xff1a;在SLM中平衡exploration与exploitation。一些方法有很…...

【动态规划】对局匹配 (分组线性DP)

题目详情 问题描述&#xff1a; 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分&#xff0c;代表他的围棋水平。   小明发现网站的自动对局系统在匹配对手时&#xff0c;只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K…...

python 提取视频中的音频

在Python中提取视频中的音频&#xff0c;你可以使用moviepy库&#xff0c;这是一个非常强大且易于使用的库&#xff0c;专门用于视频编辑。以下是如何使用moviepy来提取视频中的音频的步骤&#xff1a; 安装moviepy 首先&#xff0c;你需要安装moviepy。你可以通过pip安装它&a…...

self.cls_token在 Vision Transformer (ViT) 模型中的训练阶段和推理阶段的行为和作用的异同

self.cls_token 在 Vision Transformer (ViT) 模型中&#xff0c;在训练阶段和推理阶段的行为和作用是不同的&#xff0c;而且它的值在训练过程中会发生变化。 1. self.cls_token 的作用 在 ViT 中&#xff0c;self.cls_token 是一个特殊的、可学习的嵌入向量&#xff08;emb…...

【量化科普】Leverage,杠杆

【量化科普】Leverage&#xff0c;杠杆 &#x1f680;量化软件开通 &#x1f680;量化实战教程 在量化投资领域&#xff0c;杠杆&#xff08;Leverage&#xff09;是一个核心概念&#xff0c;它允许投资者通过借入资金来增加投资规模&#xff0c;从而放大投资收益或亏损。简…...

247g 的工业级电调,如何让无人机飞得更 “聪明“?——STONE 200A-M 深度测评

一、轻量化设计背后的技术取舍 当拿到 STONE 200A-M 时&#xff0c;247g 的重量让人意外 —— 这个接近传统 200A 电调 70% 的重量&#xff0c;源自 1205624.5mm 的紧凑结构&#xff08;0.1mm 公差控制&#xff09;。实测装机显示&#xff0c;相比同规格产品&#xff0c;其体积…...

Maven Deploy Plugin如何使用?

在Java开发中&#xff0c;Maven是一个非常重要的构建工具。它不仅可以管理项目的依赖关系&#xff0c;还能帮助我们打包和发布项目。在Maven中&#xff0c;deploy插件是一个很实用的功能&#xff0c;它可以将构建好的项目发布到远程仓库。今天&#xff0c;就来聊聊如何使用Mave…...

Node.js:快速启动你的第一个Web服务器

Node.js 全面入门指南 文章目录 Node.js 全面入门指南一 安装Node.js1. Windows2. MacOS/Linux 二 配置开发环境1. VSCode集成 三 第一个Node.js程序1. 创建你的第一个Node.js程序 四 使用Express框架1. 快速搭建服务器 一 安装Node.js 1. Windows 以下是Windows环境下Node.j…...

自定义日志回调函数实现第三方库日志集成:从理论到实战

一、应用场景与痛点分析 在开发过程中&#xff0c;我们经常会遇到以下场景&#xff1a; 日志格式统一&#xff1a;第三方库使用自己的日志格式&#xff0c;导致系统日志混杂&#xff0c;难以统一管理和分析。日志分级过滤&#xff1a;需要动态调整第三方库的日志输出级别&…...

Linux练级宝典->任务管理和守护进程

任务管理 进程组概念 每个进程除了进程ID以外&#xff0c;还有一个进程组&#xff0c;进程组就是一个或多个进程的集合 同一个进程组&#xff0c;代表着他们是共同作业的&#xff0c;可以接收同一个终端的各种信号&#xff0c;进程组也有其唯一的进程组号。还有一个组长进程&a…...

C语言:计算并输出三个整数的最大值 并对三个数排序

这是《C语言程序设计》73页的思考题。下面分享自己的思路和代码 思路&#xff1a; 代码&#xff1a; #include <stdio.h> int main() {int a,b,c,max,min,mid ; //设置大中小的数分别为max&#xff0c;mid&#xff0c;min&#xff0c;abc为输入的三个数printf("ple…...

工具(十二):Java导出MySQL数据库表结构信息到excel

一、背景 遇到需求&#xff1a;将指定数据库表设计&#xff0c;统一导出到一个Excel中&#xff0c;存档查看。 如果一个一个弄&#xff0c;很复杂&#xff0c;耗时长。 二、写一个工具导出下 废话少絮&#xff0c;上码&#xff1a; 2.1 pom导入 <dependency><grou…...

如何设计微服务及其设计原则?

微服务架构是一种将大型单体应用拆分成多个小型、自治服务的设计方式&#xff0c;每个服务专注于单一的业务功能。设计微服务时&#xff0c;需要遵循以下原则和最佳实践&#xff1a; 1. 单一职责原则 核心思想&#xff1a; 每个微服务都应该只负责一块独立的业务功能。这使得…...

ACL初级总结

ACL–访问控制列表 1.访问控制 在路由器流量流入或者流出的接口上,匹配流量,然后执行相应动作 permit允许 deny拒绝 2.抓取感兴趣流 3.ACL匹配规则 自上而下逐一匹配,若匹配到了则按照对应规则执行动作,而不再向下继续匹配 思科:ACL列表末尾隐含一条拒绝所有的规则 华为:AC…...

调优案例一:堆空间扩容提升吞吐量实战记录

&#x1f4dd; 调优案例一&#xff1a;堆空间扩容提升吞吐量实战记录 &#x1f527; 调优策略&#xff1a;堆空间扩容三部曲 # 原配置&#xff08;30MB堆空间&#xff09; export CATALINA_OPTS"$CATALINA_OPTS -Xms30m -Xmx30m"# 新配置&#xff08;扩容至120MB&am…...

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷一)

目录 1. 内存和地址 2. 指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量 2.3 解引用操作符 &#xff08;*&#xff09; 3. 指针的解引用 3.1 指针 - 整数 3.2 void* 指针 4. const修饰指针 4.1 const修饰变量 4.2 const修饰指针变量 5…...

计算机毕业设计:留守儿童的可视化界面

留守儿童的可视化界面mysql数据库创建语句留守儿童的可视化界面oracle数据库创建语句留守儿童的可视化界面sqlserver数据库创建语句留守儿童的可视化界面springspringMVChibernate框架对象(javaBean,pojo)设计留守儿童的可视化界面springspringMVCmybatis框架对象(javaBean,poj…...

golang算法二叉树对称平衡右视图

100. 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a…...

c++20 Concepts的简写形式与requires 从句形式

c20 Concepts的简写形式与requires 从句形式 原始写法&#xff08;简写形式&#xff09;等效写法&#xff08;requires 从句形式&#xff09;关键区别说明&#xff1a;组合多个约束的示例&#xff1a;两种形式的编译结果&#xff1a;更复杂的约束示例&#xff1a;标准库风格的约…...