安卓APP_ Fragment(4)—— Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页

2023-11-05

摘自:安卓APP_ Fragment(4)—— Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页
作者:丶PURSUING
发布时间: 2021-04-20 17:46:59
网址:https://blog.csdn.net/weixin_44742824/article/details/115911715

未来开发中将会大量使用Fragment + ViewPager2 这一组合模式,本篇章实现效果如下图:

实现效果

在这里插入图片描述

一、构建activity_main.xml

activity_main.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="match_parent"
    android:orientation="vertical">

<!--    高为0权重为1的设置(早有学习)可以让ViewPager界面自动适配tableView-->
    <androidx.viewpager2.widget.ViewPager2
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/viewpage"/>

</LinearLayout>

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

二、构建Adapter

一个专门的方法初始化Adapter

这里的viewPager与以往的不同,不再是一个简单的UI,是一个要控制fragment的UI。要用专门的方法去初始化viewPager。

下面使用了initPager方法。
在这里插入图片描述

创建MyFragmentPagerAdapter类

雏形如下:
在这里插入图片描述

确定适配的fragment数量

这个fragment的数量应该是从activity中传入的,实际上传入了多少个,有多少个fragment还是由Activity中说了算。

在这里插入图片描述
传入个数与回调fragment
在这里插入图片描述

三、创建fragment

创建一个fragment

页面滑动时,修改string(Textview)

通过bundle从Activity中传递信息到fragment
在这里插入图片描述

优化onCreateView

在这里插入图片描述

解析fragment_blank.xml的textView

在这里插入图片描述
为什么只定义了一个fragment却可以实现滑动切换不同的页面?

:内容复用。viewPager适配fragment有一个好处就是,只需要定义一个fragment,改变传入的值便可以不断地去适配。

四、在activity中传入数据,构建多个fragment

在这里插入图片描述

颠覆了安卓开发方式jetpack控件
2021年的app基本上都使用了mv,vm的模式,这模式就大量使用了jetpack。这个新的控件可以将安卓的生命周期,各种各样的数据管理等都会包含到这个组件中,必须掌握。

更多细节在代码中呈现

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ViewPager2 viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //这里的viewPager不再是一个简单的UI,是一个要控制fragment的UI。要用专门的方法去初始化viewPager
        initPager();
    }

    private void initPager() {
        viewPager = findViewById(R.id.viewpage);
        ArrayList<Fragment> fragments = new ArrayList<>();
        fragments.add(BlankFragment.newInstance("微信聊天"));
        fragments.add(BlankFragment.newInstance("通讯录"));
        fragments.add(BlankFragment.newInstance("发现"));
        fragments.add(BlankFragment.newInstance("我"));
        MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),
                getLifecycle(),fragments);//getLifecycle是jetpack里面的一个组件

        //系统专门提供了ViewPager适配Fragment的Adapter
        viewPager.setAdapter(pagerAdapter);
    }
}

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

activity_main.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="match_parent"
    android:orientation="vertical">

<!--    高为0权重为1的设置可以让ViewPager界面自动适配tableView-->
    <androidx.viewpager2.widget.ViewPager2
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/viewpage"/>

</LinearLayout>

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

MyFragmentPagerAdapter.java

//继承:AS专门提供了ViewPager适配Fragment的Adapter:FragmentStateAdapter
public class MyFragmentPagerAdapter extends FragmentStateAdapter {

    //传入fragment的个数
    List<Fragment> fragmentList = new ArrayList<>();

    //选择一个参数多的构造方法
    public MyFragmentPagerAdapter(@NonNull FragmentManager fragmentManager,
                                  @NonNull Lifecycle lifecycle,List<Fragment>fragments) {
        super(fragmentManager, lifecycle);
        fragmentList = fragments;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return fragmentList.size();
    }
}

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

BlankFragment.java

public class BlankFragment extends Fragment {

    private static final String ARG_TEXT = "param1";

    //用于接收从Activity中bundle里的信息
    private String mTextSring;
    View rootView;

    public BlankFragment() {
        // Required empty public constructor
    }

    //newInstance专门用于去构建BlankFragment
    public static BlankFragment newInstance(String param1) {
        BlankFragment fragment = new BlankFragment();
        // Bundle用于fragment与Activity通信
        Bundle args = new Bundle();
        args.putString(ARG_TEXT, param1);

        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mTextSring = getArguments().getString(ARG_TEXT);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if(rootView == null){
            rootView = inflater.inflate(R.layout.fragment_blank, container, false);
        }
        //解析fragment_blank.xml的textView
        initView();
        return rootView;
    }

    private void initView() {
        TextView textView = rootView.findViewById(R.id.text);
        textView.setText(mTextSring);
    }
}

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

fragment_blank.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=".BlankFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="36dp"
        android:id="@+id/text"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓APP_ Fragment(4)—— Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页 的相关文章

  • 架构的概念与介绍

    1 什么是架构和架构本质 在软件行业 对于什么是架构 都有很多的争论 每个人都有自己的理解 此君说的架构和彼君理解的架构未必是一回事 LInux有架构 MySQL有架构 JVM也有架构 使用Java开发 MySQL存储 跑在Linux上的业
  • r语言聚类分析_【SPSS数据分析】SPSS聚类分析(R型聚类)的软件操作与结果解读 ——【杏花开生物医药统计】...

    在上一讲中 我们讲述了针对样本进行聚类的分析方法 Q型聚类 今天我们将详细讲解针对变量数据进行的聚类分析 系统聚类之R型聚类 我们要将数据变量进行聚类 但不知道要分成几类 或者没有明确的分类指标的时候 就需要用到R型聚类 R型聚类分析不但可
  • 根据Sql生成ER图

    原文 https blog csdn net qq 17010367 article details 79212850 commentsedit 1 根据SQL文件生成ER图 首先准备好SQL文件 然后在PowerDesigner 里 点击
  • 字符串表达式校验&求值(C#实现) - 附代码

    一 参考文献 严蔚敏 数据结构 C语言版 二 功能演示 1 测试例子 2 测试结果 三 对表达式进行校验 怎么对输入的字符串表达式进行校验呢 1 对表达式按操作符进行拆分 返回一个字符串数组 代码 private static string
  • Oracle数据库删除重复数据

    Oracle数据库中如何删除重复数据 第一种情况 部分字段重复数据的删除 先查询出那些数据是重复的 select 字段1 字段2 count from 表名 group by 字段1 字段2 having count gt 1 将上面的大于
  • TIA博途S7-1200学习笔记——指令集

    目录 1 位逻辑运算操作 1 1 常开触点 1 2 常闭触点 1 3 取反触点 1 4 线圈 1 5 赋值取反 1 6 复位输出 1 7 置位输出 1 8 置位位域 1 9 复位位域 2 10 SR置位 复位触发器 1 11 RS复位 置位
  • 【activiti】网关

    activiti网关 网关是用来控制流程的走向的 1 排他网关 ExclusiveGateway 1 1 什么是排他网关 排他网关 用来在流程中实现决策 当执行到这个网关时 会根据判断条件去选择执行某一条分支 注意 排他网关只会选择一个为t
  • 5.5_数据的存储和排列

    文章目录 一 大小端模式 二 边界对齐 在这个小结中 我们要探讨的是 数据的存储和排列 一 大小端模式 首先来看一个之前提到过的问题 叫做大小端模式 我们在内存里经常会存储某一些多字节的数据 比如 c 语言里的 Int 型变量 在很多时候占
  • renren-fast 快速开发 Web 管理平台

    什么是 renren fast renren fast 是一个 Java 的开源项目 只需要对它进行简单修改 就能够应用到自己的项目中 大大简化开发流程 缩短开发周期 renren fast 是一个前后端分离开发的项目 前端基于 vue e
  • 算法之动态规划理论

    目录 前言 一个模型三个特征理论讲解 1 最优子结构 2 无后效性 3 重复子问题 一个模型三个特征实例剖析 两种动态规划解题思路总结 1 状态转移表法 2 状态转移方程法 四种算法思想比较分析 总结 参考资料 前言 本篇博文主要讲解动态规
  • 一步一步详解LSTM网络【从RNN到LSTM到GRU等,直至attention】

    一步一步详解LSTM网络 从RNN到LSTM到GRU等 直至attention 0 前言 1 Recurrent Neural Networks循环神经网络 2 The Problem of Long Term Dependencies长期

随机推荐

  • 直接理解转置卷积(Transposed convolution)的各种情况

    使用GAN生成图像必不可少的层就是上采样 其中最常用的就是转置卷积 Transposed Convolution 如果把卷积操作转换为矩阵乘法的形式 转置卷积实际上就是将其中的矩阵进行转置 从而产生逆向的效果 所谓效果仅仅在于特征图的形状
  • Word模板引擎poi-tl

    文章目录 方案对比 版本 特性 模板 数据 输出 数据模型 标签 1 文本 2 图片 3 表格 4 列表 5 嵌套 6 区块对 SpingEL 2 单系列图标 3 多系列图标 4 组合图表 配置 1 标签前后缀 2 标签类型 3 标签匹配值
  • vlc源码编译android最新版2020年9月份记录

    经过几天研究终于在2020 9 25早上编译出安卓版本的vlc for android的so文件了 此时源码指定gradle是6 1 1版本的 主要参考都是百度上面的 你们也能百度到 这里就不引用了 重点 1 参考vlc官方编译过程 htt
  • 激光扫描测量点模拟(Matlab源码)

    本文提供了一个模拟环境 模拟激光束打到物体表面上的点及地面点 可以设置激光范围 分辨率 物体位置 大小及旋转 近期需要分析激光扫描仪在物体的背景上产生的遮挡 没找到合适的环境 自己用Matlab写了一个 原理不难 但细节的东西挺多 本以为一
  • 【达内课程】DataInputStream、DataOutputStream用法

    文章目录 简介 DataOutputStream DataInputStream 栗子1 写入数据 栗子2 读取 栗子3 保存学生信息 简介 在 io 包中 提供了两个与平台无关的数据操作流 数据输出流 DataOutputStream 数
  • C语言语法笔记

    C语言语法笔记 C 语言教程 网道 wangdoc com C 语言教程 菜鸟教程 runoob com 文章目录 C语言语法笔记 一 关键字 32 二 预编译指令 三 流程控制 3 1 顺序结构 3 2 循环结构 3 3 条件结构 四 变
  • OpenStack--镜像制作

    通过 KVM 安装虚 Centos 和 Windwos 2008 R2 x86 64 操作系统步骤并将磁盘文件作为镜像上传到 openstack glance 作为批量创建虚拟机的镜像文件 其中 windowsn 2008 安装 virti
  • 产品开发项目中文档的重要性

    现在 很多人认为写文档是一件苦差使 特别是研发人员 觉得写文档是一种浪费 和产品开发工作没有太大关系 更愿意把写文档的时间用来写代码画图纸 实际上 一个成功完整的产品开发项目 最终产出的不只是可交付的实际产品 还包括产品开发过程中的文档 以
  • Slim-neck by GSConv:自动驾驶车辆检测器架构的更好设计范式(文末附代码)

    Slim neck by GSConv 自动驾驶车辆检测器架构的更好设计范式 摘要 引言 相关工作 本文方法 GSConv的优势在于轻量级检测器 这些检测器通过添加DSC层和Shuffle来增加非线形表达能力 但是 如果GSConv在模型的
  • 用遗传算法求解TSP问题

    原文链接 http blog 5long me 2015 genetic algorithm on tsp 遗传算法简介 关于遗传算法 首先看一段维基百科的解释 遗传算法是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法 它借鉴了达尔
  • elementUI的自定义主题

    elementUI的自定义主题的设置 一 安装elementUI以及sass loader node sass 项目中使用scss编写需要依赖的插件 npm i element ui S npm i sass loader D npm i
  • 数据分析笔记

    数据分析 1 不同数据格式读取 mysql数据操作 text文件操作 json文件操作 csv文件操作 excel文件操作 1 1 mysql 数据操作 pip intall pymysql import pymysql pymysql c
  • 毕业设计 - 基于单片机的放松按摩仪设计与实现 - 物联网 嵌入式 stm32

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 AB32VG1主控MCU NTC温度采集 adc7 PE5 其他器件引脚 5 软件说明 5 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设
  • QT学习——QFileSystemModel与QTreeView显示文件夹下的文件信息

    最近因为项目需求 使用QT做界面 新手学习 记录一些笔记 虽然QT已经做好了标准对话框的国际化 但是有时候对于中文的翻译可能达不到我们期望的 所以就需要我们自己来修改 比如下面的代码中 利用了国际化 写在main函数中 QApplicati
  • 常见查找算法

    1 常见查找概念 查找指根据给定的某个值 在查找表中确定一个其关键字等于给定值的数据元素 查找表是由同一类型的数据元素或记录构成的集合 关键字是数据元素中某个数据项的值 又称为键值 主关键字可以唯一地标识一个记录 次关键字可以标识多个数据元
  • linux中某个端口拒绝远程主机连接原因及解决方法

    linux中某个端口拒绝远程主机连接原因及解决方法 问题描述 比如在本机telent到 192 168 8 170 主机的9000 端口 被拒绝 zhu hadoop log telnet 192 168 8 170 9000 Trying
  • OpenCv之图像直方图

    目录 一 基本概念 二 使用OpenCv统计直方图 三 使用掩膜的直方图 一 基本概念 图像直方图是用一表示教字图像中亮度分布的直方图 标绘了图像中每个高度值的像素数 可以借助观察该有方图了解需要如何调整亮度分布的直方图 这种直方图中 横坐
  • QT中以get,post方式调用后台web api接口(.NET开发)

    在QTCreator中 包含头文件 include
  • react如何获取表单数据

    react如何获取表单数据 分为两种情况 第一种是每次输入都会更新状态 第二种是只有用到的时候才获取 会用大量的ref 不推荐 这里主要介绍第一种 这是我们要操作的数据 state resume username password 通过传参
  • 安卓APP_ Fragment(4)—— Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页

    摘自 安卓APP Fragment 4 Fragment ViewPager2 模拟微信首页 1 两者联动实现翻页 作者 丶PURSUING 发布时间 2021 04 20 17 46 59 网址 https blog csdn net w