安卓APP_ Fragment(5)—— Fragment + ViewPager2 模拟微信首页 (2)两者联动翻页

摘自:安卓APP_ Fragment(5)—— Fragment + ViewPager2 模拟微信首页 (2)两者联动实现翻页
作者:丶PURSUING
发布时间: 2021-04-22 00:11:43
网址:https://blog.csdn.net/weixin_44742824/article/details/115956924

目录

  • 效果与UI框架
  • (1)定义导航栏大致布局
  • (2)初步设置导航栏图标点击响应事件
  • (3)导航栏图标跟随viewPager滑动一同变化
  • (4)点击导航栏图标,切换viewPager
  • 更多细节在具体代码中体现

效果与UI框架

模拟微信首页的最终实现效果如下图:

在这里插入图片描述

要实现下面导航栏的效果,有很多的实现方案,典型的是navigation。这个控件把整个联动效果都完成了,开发变得非常简单,在下一章节中再介绍这个简便高级的办法
在这里插入图片描述
在这里插入图片描述

下面硬撸代码,了解更底层地原理。一行行手写效果。总的UI框架为:
在这里插入图片描述

(1)定义导航栏大致布局

导航栏框
在这里插入图片描述
导航栏中的图标按钮(其中一个)
在这里插入图片描述
点击按钮图标的变化实际上是换了一张图片
在这里插入图片描述

(2)初步设置导航栏图标点击响应事件

用图标所对应的LinearLayout响应点击事件
在这里插入图片描述
布局初始化与设置监听
在这里插入图片描述

在main.xml中引用
在这里插入图片描述

(3)导航栏图标跟随viewPager滑动一同变化

viewPager既然能够设置滑动,必然有滑动的监听接口
在这里插入图片描述
要重置状态,使得按钮变化正常化(不点击与点击对应不同状态)

在这里插入图片描述

(4)点击导航栏图标,切换viewPager

完成按钮的点击事件
在这里插入图片描述
viewPager设置item,实现页面切换
在这里插入图片描述

更多细节在具体代码中体现

代码架构
在这里插入图片描述
bottom_layout.xml

<?xml version="1.0" encoding="utf-8"?><!--导航栏布局,方向为水平,颜色为#0E0E0E(灰色)-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="55dp"android:background="@color/gray"android:orientation="horizontal"><!--    宽度设置为0,权重为1,表示宽度按照LL个数自动分配--><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"android:id="@+id/id_tab_weixin"><ImageViewandroid:layout_width="32dp"android:layout_height="32dp"android:id="@+id/tab_iv_weixin"android:background="@drawable/tab_weixin"/><TextViewandroid:layout_width="32dp"android:layout_height="wrap_content"android:id="@+id/text_weixin"android:gravity="center"android:text="微信"/></LinearLayout><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"android:id="@+id/id_tab_contact"><ImageViewandroid:layout_width="32dp"android:layout_height="32dp"android:id="@+id/tab_iv_contact"android:background="@drawable/table_contact"/><TextViewandroid:layout_width="32dp"android:layout_height="wrap_content"android:id="@+id/text_contact"android:gravity="center"android:text="通讯录"/></LinearLayout><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"android:id="@+id/id_tab_find"><ImageViewandroid:layout_width="32dp"android:layout_height="32dp"android:id="@+id/tab_iv_find"android:background="@drawable/tab_find"/><TextViewandroid:layout_width="32dp"android:layout_height="wrap_content"android:id="@+id/text_find"android:gravity="center"android:text="发现"/></LinearLayout><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:orientation="vertical"android:id="@+id/id_tab_my"><ImageViewandroid:layout_width="32dp"android:layout_height="32dp"android:id="@+id/tab_iv_my"android:background="@drawable/tab_my"/><TextViewandroid:layout_width="32dp"android:layout_height="wrap_content"android:id="@+id/text_my"android:gravity="center"android:text=""/></LinearLayout></LinearLayout>
  • 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
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

tab_find.xmltab_my.xmltab_contact.xmltab_weixin.xml类似

<?xml version="1.0" encoding="utf-8"?><!--点击状态是一张图片,非点击是另外一张-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/ic_baseline_chat_bubble_24" android:state_selected="true"/><item android:drawable="@drawable/ic_baseline_chat_bubble_outline_24"/>
</selector>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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界面自动适配bottom_layout--><androidx.viewpager2.widget.ViewPager2android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/viewpage"/><!--    引用bottom_layout.xml--><include layout="@layout/bottom_layout"/></LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ViewPager2 viewPager;private LinearLayout llWeixin,llContact,llFind,llMy;//ivCurrent用于保存当前画面private ImageView ivWeixin,ivContact,ivFind,ivMy,ivCurrent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//这里的viewPager不再是一个简单的UI,是一个要控制fragment的UI。要用专门的方法去初始化viewPagerinitPager();initTabView();}//这个函数专门处理UI的更新private void initTabView() {llWeixin = findViewById(R.id.id_tab_weixin);llWeixin.setOnClickListener(this);llContact = findViewById(R.id.id_tab_contact);llContact.setOnClickListener(this);llFind = findViewById(R.id.id_tab_find);llFind.setOnClickListener(this);llMy = findViewById(R.id.id_tab_my);llMy.setOnClickListener(this);ivWeixin = findViewById(R.id.tab_iv_weixin);ivContact = findViewById(R.id.tab_iv_contact);ivFind = findViewById(R.id.tab_iv_find);ivMy = findViewById(R.id.tab_iv_my);//微信一进来显示的应该是聊天界面ivWeixin.setSelected(true);//设置当前页面ivCurrent = ivWeixin;}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的AdapterviewPager.setAdapter(pagerAdapter);//viewpager的高级用法:既然能够设置滑动,必然有滑动的监听接口viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {@Override//实现动画的滚动动效可以放在这里实现public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {super.onPageScrolled(position, positionOffset, positionOffsetPixels);}@Override//选择后改变位置放在这里实现,响应页面改变public void onPageSelected(int position) {super.onPageSelected(position);//viewpager的滑动对应改变导航栏的UIchangeTab(position);}@Overridepublic void onPageScrollStateChanged(int state) {super.onPageScrollStateChanged(state);}});}//viewpager的滑动对应改变导航栏的UIprivate void changeTab(int position) {//把上一次的图标点击事件取消,相当于复位ivCurrent.setSelected(false);switch (position) {case 0:case R.id.id_tab_weixin://导航栏对viewpage的联动,点击导航栏切换页面viewPager.setCurrentItem(0);//viewpage对导航栏的联动,选中为ivWeixin,则对应的图片被选中ivWeixin.setSelected(true);//标记当前图标ivCurrent = ivWeixin;break;case 1:case R.id.id_tab_contact:viewPager.setCurrentItem(1);//选中为ivWeixin,则对应的图片被选中ivContact.setSelected(true);ivCurrent = ivContact;break;case 2:case R.id.id_tab_find:viewPager.setCurrentItem(2);//选中为ivWeixin,则对应的图片被选中ivFind.setSelected(true);ivCurrent = ivFind;break;case 3:case R.id.id_tab_my:viewPager.setCurrentItem(3);//选中为ivWeixin,则对应的图片被选中ivMy.setSelected(true);ivCurrent = ivMy;break;}}@Overridepublic void onClick(View v) {changeTab(v.getId());}
}
  • 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
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120

最后的关于fragment的fragment_blank.xmlBlankFragment.javaMyFragmentPagerAdapter.java均在上一章节中有,且完全一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265755.shtml

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

相关文章

stmmac描述符的结构和初始化

stmmac 描述符&#xff08;Descriptors&#xff09; stmmac的描述符有两个个模式&#xff0c;分别是ring模式和chain模式&#xff0c;根据特性的不同支持&#xff0c;描述符又有以下3个形式norm、Alternate 、 Enhanced。下面主要讲下ring模式下的Enhanced描述符结构&#xff…

Android中利用productFlavors配置多渠道

build.gradle(app)设置 android {flavorDimensions "default"productFlavors{//不同渠道360{dimension "default"//替换AndroidManifest中的值manifestPlaceholders [channel_value:"360"]}qq{dimension "default"//替换AndroidManif…

Ubuntu服务器安装snmpd(用于监控宝)

2019独角兽企业重金招聘Python工程师标准>>> 一、安装snmpd&#xff1a; sudo apt-get install snmpd 二、修改配置文件 vi /etc/snmp/snmpd.conf 找到这样的两行 agentAddress udp:127.0.0.1:161 #agentAddress udp:161,udp6:[::1]:161 将他们的注释交换一下 #…

安卓APP_ 四大基本组件(1)—— Activity

摘自&#xff1a;安卓APP_ 四大基本组件&#xff08;1&#xff09;—— Activity 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-22 15:56:18 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/116006048 配合菜鸟教程食用效果更佳&#xf…

radare2 常用操作总结

radare2 简介 radare2是一个用C语言编写的跨平台的二进制分析工具&#xff0c;支持ARM、MIPS、X86等平台&#xff0c;支持分析多种格式的二进制文件如ELF、Mach-O、Fatmach-O, PE、PE、 MZ、 COFF等&#xff0c;同时也支持多种操作系统如Windows (since XP)、GNU/Linux、GNU/D…

序列化与反序列化(1)Serializable —— Java原生态方法

摘自&#xff1a;序列化与反序列化&#xff08;1&#xff09;Serializable —— Java原生态方法 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-05-08 19:20:21 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/116503261 本文为学习笔记&…

极路由4刷机

准备工作 https://www.right.com.cn/forum/thread-161906-1-1.html https://breed.hackpascal.net/ 在第二个链接里下载路由器对应的breed固件&#xff0c;固件的说明见第一个链接&#xff0c;下文以极路由4为例演示 由于极路由官方挂了&#xff0c;无法进行root&#xff0…

评论安装_评论送|机电安装监理质量控制要点130页

来源&#xff1a;网络整理&#xff0c; 如有侵权请联系删除因本文篇幅有限&#xff0c;只能展示60页&#xff0c;全部130页需要您对本文进行精彩评论或者转发分享&#xff0c;加微信dahe0608送给您本文的ppt原件因本文篇幅有限&#xff0c;只能展示60页&#xff0c;全部130页需…

积跬步-java任职要求

2019独角兽企业重金招聘Python工程师标准>>> 1.JAVA基础扎实&#xff0c;熟悉io、多线程、集合等基础框架&#xff0c;熟悉分布式、缓存、消息、搜索等机制&#xff1b; 2.四年以上使用java进行web开发的经验&#xff0c;熟练使用spring 、MVC等框架&#xff0c;熟悉…

安卓APP_ 控件(11)webView —— 简单应用:显示网页

摘自&#xff1a;安卓APP_ 控件&#xff08;11&#xff09;webView —— 简单应用&#xff1a;显示网页 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-05-11 11:50:52 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/116602469 目录 简单了…

QT应用开发基础

目录前言Windows上搭建开发环境C基础什么是C什么是面向对象&#xff0c;什么又是面向过程c的灵魂&#xff1a;c的类对象&#xff1a;类的实例化怎么访问类的成员类的函数成员类的访问修饰符函数的重载构造函数和析构函数类的继承虚函数和纯虚函数制作一个简单的QT界面创建工程U…

meson构建系统

简介 Meson是一个构建系统&#xff0c;它被设计成在不牺牲性能的前提下尽可能的友好。这方面的主要工具是用户用来描述构建结构的自定义语言。这种语言的主要设计目标是简单、清晰和简洁。很多灵感都来自于Python编程语言&#xff0c;它被认为是非常易读的&#xff0c;即使对以…

射灯安装方法图解_江苏天筑不锈钢雕塑厂家格栅射灯安装方法,格栅射灯安装注意事项...

格栅射灯安装方法&#xff0c;您是否已经学会了呢&#xff1f;不管您会不会&#xff0c;今天江苏天筑不锈钢雕塑厂家就结合这个问题&#xff0c;一起来为大家详细介绍这部分内容的一些相关的注意事项&#xff0c;南方的天气比较潮湿&#xff0c;所以我们尽量不要把格栅射灯安装…

ARM体系结构简介 —— 迅为

目录单片机和ARM处理器内存管理单元&#xff08;MMU&#xff09;高速缓冲存储器&#xff08;CACHE&#xff09;指令集ARM的指令系统ARM处理器工作模式ARM处理器的内部寄存器ARM处理器的异常ARM中断向量ARM架构的发展单片机和ARM处理器 内存管理单元&#xff08;MMU&#xff09;…

网口扫盲二:Mac与Phy组成原理的简单分析(转)

1. general 下图是网口结构简图.网口由CPU、MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中. 对于上述的三部分,并不一定都是独立的芯片,根据组合形式,可分为下列三种方案: CPU集成MAC与PHY;CPU集成MAC,PHY采用…

设置git协议clone代理

0x0 最近在clone yaffs2仓库时发现clone的异常缓慢&#xff0c;就算开了代理也是&#xff0c;搜索一番发现网上大多都是将设置http、https、ssh协议的代理&#xff0c;对于git协定的代理讲的很少&#xff0c;下面分享下如何让git协议走socks代理 以下内容前提是里已经在电脑上…

vue-cli 3.0安装和使用

零. 前言 公司最近开发项目使用的是vue-cli 3.0版本开发&#xff0c;但是对于vue-cli 3.0版本一直没有研究过如何使用&#xff0c;公司使用配置&#xff1a;pug ts stylus eslint&#xff1b;编辑器使用&#xff1a;vscode&#xff0c;使用起来简直不要太爽。 默认你已经安装…

lucene 入门整理

2019独角兽企业重金招聘Python工程师标准>>> 1. 概述 Lucene是一个全文检索引擎的架构&#xff0c;提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能&am…

安卓APP开发基础

目录安卓工程构建第一个APP运行安卓的工程目录文件夹介绍安卓APP启动过程安卓布局控件布局的种类布局和页面的关系显示一张美女图显示两个美女常用布局之相对布局基础控件之Button,TextView,EditText,ImageView, padding和margin(内外边框)相对布局综合小演练-智能家居刷卡界面…