Android滑动片段
本文所有的代码均存于
https://github.com/MADMAX110/BitsandPizzas
回到BitsandPizzas应用,之前已经创建过创建订单和发出反馈等功能。
修改披萨应用,让它使用标签页导航。在工具条下显示一组标签页,每个选项对应一个不同的标签页。用户单击一个标签页时,就会显示该选项的屏幕。
修改MainActivity使其使用标签页,标签页包含对应Home,Pizzas,Pasta和Stores的选项,使用户能很容易地导航到应用的主要部分。
1、创建四个基本片段
TopFragment、PizzaFragment、PastaFragment、StoresFragment
2、支持片段之间的滑动导航
3、增加标签页布局
最后、我们要为MainActivity增加一个标签页布局,这可以结合滑动导航使用。用户可以单击标签页导航到各个片段,也可以在片段之间滑动来进行导航。
一、创建TopFragment
在com.hfad.bitsandpizzas包中新建一个Fragment(Blank),其布局名为fragment_top。
以下使TopFragment.java的代码:
package com.hfad.bitsandpizzas;import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class TopFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_top, container, false);}
}
在strings.xml中增加字符串资源:
<string name="title_top">Top fragment</string>
更新fragment_top.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=".TopFragment"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/title_top" /></FrameLayout>
二、创建PizzaFragment
PizzaFragment是一个用来显示披萨列表的列表片段,所以不需要布局,直接新建PizzaFragment。
在strings.xml中增加一个字符串数组资源
<string-array name="pizzas"><item>Diavolo</item><item>Funghi</item>
</string-array>
然后修改PizzaFragment.java
package com.hfad.bitsandpizzas;import android.os.Bundle;
import androidx.fragment.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;public class PizzaFragment extends ListFragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {ArrayAdapter<String> adapter = new ArrayAdapter<>(inflater.getContext(),android.R.layout.simple_list_item_1,getResources().getStringArray(R.array.pizzas));setListAdapter(adapter);return super.onCreateView(inflater, container, savedInstanceState);}
}
三、创建PastaFragment
创建一个名为PastaFragment的ListFragment显示页面列表。
增加一个字符串数组:
<string-array name="pasta"><item>Spaghetti Bologness</item><item>Lasagne</item></string-array>
然后修改PastaFragment.java
package com.hfad.bitsandpizzas;import android.os.Bundle;
import androidx.fragment.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;public class PastaFragment extends ListFragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {ArrayAdapter<String> adapter = new ArrayAdapter<>(inflater.getContext(),android.R.layout.simple_list_item_1,getResources().getStringArray(R.array.pasta));setListAdapter(adapter);return super.onCreateView(inflater, container, savedInstanceState);}
}
四、创建StoresFragment
这也是一个列表片段,没有视图。
新建字符串数组:
<string-array name="stores"><item>Cambridge</item><item>Sebastopol</item></string-array>
修改StoresFragment.java
package com.hfad.bitsandpizzas;import android.os.Bundle;
import androidx.fragment.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;public class StoresFragment extends ListFragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {ArrayAdapter<String> adapter = new ArrayAdapter<>(inflater.getContext(),android.R.layout.simple_list_item_1,getResources().getStringArray(R.array.stores));setListAdapter(adapter);return super.onCreateView(inflater, container, savedInstanceState);}
}
五、为MainActivity的布局增加一个视图分页控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"><includelayout="@layout/toolbar_main"android:id="@+id/toolbar"/><androidx.viewpager.widget.ViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
使用片段分页控件适配器让视图分页控件了解页面
要让一个视图分页控件在它的各个页面上显示一个片段,需要提供两个主要信息:有多少个页面,以及各个页面上要显示哪个片段。为此,要创建一个片段分页控件适配器,并把它增加到活动代码中。
片段分页控件适配器是专门为视图分页控件中的页面增加片段的一种适配器类型。
在MainActivity中增加片段分页控件适配器:
package com.hfad.bitsandpizzas;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.ShareActionProvider;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;public class MainActivity extends AppCompatActivity {//增加一个ShareActionProvider私有变量private ShareActionProvider shareActionProvider;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//设置工具条为活动的应用条Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);SectionsPagerAdapter pagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());ViewPager pager = (ViewPager) findViewById(R.id.pager);pager.setAdapter(pagerAdapter);}private void setShareActionIntent(String text) {//创建一个意图使用共享动作提供者的setShareIntent()方法来传递这个意图Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT, text);shareActionProvider.setShareIntent(intent);}@Override//将菜单资源文件增加到应用条public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main, menu);//得到共享动作提供者的一个引用,并赋给这个私有变量。然后调用setShareActionIntent这个方法MenuItem menuItem = menu.findItem(R.id.action_share);shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);setShareActionIntent("Want to join me for pizza?");//所有onCreateOptionsMenu方法基本上都是这样的return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {if (item.getItemId() == R.id.action_create_order){Intent intent = new Intent(this, OrderActivity.class);startActivity(intent);return true;}else {return super.onOptionsItemSelected(item);}}private class SectionsPagerAdapter extends FragmentPagerAdapter {public SectionsPagerAdapter(@NonNull FragmentManager fm) {super(fm);}@Overridepublic int getCount() {return 4;}@NonNull@Overridepublic Fragment getItem(int position) {switch (position) {case 0:return new TopFragment();case 1:return new PizzaFragment();case 2:return new PastaFragment();case 3:return new StoresFragment();}return null;}}
}
六、为Main标签增加标签页导航
使用标签页时,要把标签页增加到布局,然后编写活动代码将这些标签页关联到视图分页控件。
更新activity_main布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"android:orientation="vertical"><com.google.android.material.appbar.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" ><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize" /><com.google.android.material.tabs.TabLayoutandroid:id="@+id/tabs"android:layout_width="match_parent"android:layout_height="wrap_content"/></com.google.android.material.appbar.AppBarLayout><androidx.viewpager.widget.ViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
增加四个字符串资源
<string name="home_tab">Home</string><string name="pizza_tab">Pizzas</string><string name="pasta_tab">Pasta</string><string name="store_tab">Stores</string>
更新MainActivity.java
package com.hfad.bitsandpizzas;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.ShareActionProvider;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;import com.google.android.material.tabs.TabLayout;public class MainActivity extends AppCompatActivity {//增加一个ShareActionProvider私有变量private ShareActionProvider shareActionProvider;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//设置工具条为活动的应用条Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);SectionsPagerAdapter pagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());ViewPager pager = (ViewPager) findViewById(R.id.pager);pager.setAdapter(pagerAdapter);TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);tabLayout.setupWithViewPager(pager);}private void setShareActionIntent(String text) {//创建一个意图使用共享动作提供者的setShareIntent()方法来传递这个意图Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT, text);shareActionProvider.setShareIntent(intent);}@Override//将菜单资源文件增加到应用条public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main, menu);//得到共享动作提供者的一个引用,并赋给这个私有变量。然后调用setShareActionIntent这个方法MenuItem menuItem = menu.findItem(R.id.action_share);shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);setShareActionIntent("Want to join me for pizza?");//所有onCreateOptionsMenu方法基本上都是这样的return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {if (item.getItemId() == R.id.action_create_order){Intent intent = new Intent(this, OrderActivity.class);startActivity(intent);return true;}else {return super.onOptionsItemSelected(item);}}private class SectionsPagerAdapter extends FragmentPagerAdapter {public SectionsPagerAdapter(@NonNull FragmentManager fm) {super(fm);}@Overridepublic int getCount() {return 4;}@NonNull@Overridepublic Fragment getItem(int position) {switch (position) {case 0:return new TopFragment();case 1:return new PizzaFragment();case 2:return new PastaFragment();case 3:return new StoresFragment();}return null;}public CharSequence getPageTitle(int position) {switch (position) {case 0:return getResources().getText(R.string.home_tab);case 1:return getResources().getText(R.string.pizza_tab);case 2:return getResources().getText(R.string.pasta_tab);case 3:return getResources().getText(R.string.store_tab);}return null;}}
}
试一试
效果如图,并可以左右滑动切换标签。
相关文章:

Android滑动片段
本文所有的代码均存于 https://github.com/MADMAX110/BitsandPizzas 回到BitsandPizzas应用,之前已经创建过创建订单和发出反馈等功能。 修改披萨应用,让它使用标签页导航。在工具条下显示一组标签页,每个选项对应一个不同的标签页。用户单击…...

【力扣-每日一题】337. 打家劫舍 III
class Solution { public:pair<int,int> dfs_rob(TreeNode *root){//如果为根节点if(rootnullptr)return {0,0};auto [l,l_n]dfs_rob(root->left);auto [r,r_n]dfs_rob(root->right);int ol_nr_nroot->val;//当前节点偷,所获得的利益,子节点不能偷in…...
Docker部署FastDFS分布式存储
1、准备工作 docker pull qinziteng/fastdfs:5.05 Pwd"/data/software/fastdfs" mkdir ${Pwd}/{storage,tracker} -p2、创建TEST容器,将fastdfs目录COPY到本地,方便后续维护管理! docker run -id --name fastdfs qinziteng/fastd…...

MyBatis基础之SqlSession
SqlSession 线程安全问题 当你翻看 SqlSession 的源码时,你会发现它只是一个接口。我们通过 MyBatis 操作数据库,实际上就是通过 SqlSession 获取一个 JDBC 链接,然后操作数据库。 SqlSession 接口有 3 个实现类: #实现类1Defa…...

笔记本电脑没有麦克风,声音无法找到输入设备
新买的电脑没有扬声器,电脑声音没有输入设备,在开腾讯会议的时候才发现竟然有这个问题。 网上找原因,哎,找了一大堆每一个靠谱的 这让我想起来上次电脑没有热键的问题,所有问题的终极解决方案,都在源头那里…...

MySQL基础—从零开始学习MySQL
01.MySQL课程介绍_哔哩哔哩_bilibili 1、MySQL安装 以管理员身份运行cmd net start mysql80net stop mysql80 客户端连接 1). 方式一:使用MySQL提供的客户端命令行工具 2). 方式二:使用系统自带的命令行工具执行指令 mysql [-h 127.0.0.1] [-P 3…...
单例模式设计
目标: 1. 饿汉模式 2. 懒汉模式 3. 饿汉模式优化 目录 饿汉模式 懒汉模式 懒汉模式优化 饿汉模式 由名字我们就可以知道 "饿汉" 嘛,就比较急切,在类加载的时候就创建实例: 1. 写一个类,在本类中构造实…...

轻量型服务器能支撑多少人访问?
一、服务器配置影响访问人数 服务器的配置是影响轻量型服务器能够支撑的访问人数的关键因素之一。通常而言,轻量型服务器的配置普遍不高,适合小型团队或个人使用。如果服务器配置较低,那么支撑访问人数的能力也会受到限制。较为简单的应用程序…...
python: Sorting Algorithms
# encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看:Python Sorting Algorithms # 描述: * https://www.programiz.com/dsa/counting-sort # * https://www.geeksforgeeks.org/sorting-algorithms/ # Author : geovindu,Geovin Du 涂…...
Python 安装js环境
在终端执行下面的命令 npm install jsdom jsdom 是一个实现了 DOM API 的 JavaScript 环境,用于在 Node.js 中模拟浏览器的 DOM 环境。execjs 使用 jsdom 这个模块来执行 JavaScript 代码。所以在你的系统中,需要先安装并配置好 jsdom 模块,…...

2023华为杯数模C题——大规模创新类竞赛评审方案研究
B题——大规模创新类竞赛评审方案研究 思路:采用数据分析等手段改进评分算法性能 完成情况(1-2问已经完成) 代码下载 问题一 在每个评审阶段,作品通常都是随机分发的,每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比…...
人工神经网络ANN:数学总结
一、内容 径向基函数(Radial basis function,RBF):一个取值仅依赖于到原点距离的实值函数,即。此外,也可以按到某一中心点c的距离来定义,即。 可以用于许多向函基数的和来逼近某一给定的函数&a…...

RabbitMQ的工作模式——WorkQueues
1.工作队列模式 生产者代码 public class Producer_WorkQueues1 {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133&qu…...
AOJ 0531 坐标离散化
一、题目大意 在(0<x<w,0<y<h)的坐标系里有多个矩形,把区域分成了多个部分,我们需要针对找出被矩形分割的连通的区块数量。 二、解题思路 这个题目其实和学DFS时候那个找出连通的水洼是一样的。只是这个地图比较大,…...

Python —— pytest框架
1、认识pytest框架 1、搭建自动化框架的思路与流程 1、搭建自动化测试框架的思路和流程,任意测试手段流程都是一致的:手工测试、自动化测试、工具测试 手工测试:熟悉业务 —— 写用例 —— 执行用例并记录结果 —— 生成测试报告自动化测试…...

IP地址欺骗的危害与后果
IP地址欺骗,也被称为IP地址伪装或IP地址欺诈,是一种网络攻击技术,旨在伪装或隐藏攻击者的真实IP地址。尽管这种技术可能有一些合法的用途,例如保护用户的隐私或绕过地理位置限制,但它也经常被恶意黑客用于不法行为。本…...

系统集成|第十章(笔记)
目录 第十章 质量管理10.1 项目质量管理概论10.2 主要过程10.2.1 规划质量管理10.2.2 实施质量保证10.2.3 质量控制 10.3 常见问题 上篇:第九章、成本管理 第十章 质量管理 10.1 项目质量管理概论 质量管理:指确定质量方针,质量目标和职责&a…...
Linux之perf(7)配置
Linux之perf(7)配置类命令 Author:Onceday Date:2023年9月23日 漫漫长路,才刚刚开始… 注:该文档内容采用了GPT4.0生成的回答,部分文本准确率可能存在问题。 参考文档: Tutorial - Perf Wiki (kernel.org)perf(1)…...

14:00面试,14:06就出来了,问的问题过于变态了。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...

JPA的注解@Field指定为Keyword失败,导致查询不到数据
一、背景 使用 jpa 对es操作,查询条件不生效,需求是批量查询课程编号。说白了,就是一个In集合的查询。在es里,如果是精准匹配是termQuery,比如: queryBuilder.filter(QueryBuilders.termQuery(“schoolId…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...