展开说说:Android Fragment完全解析-卷二

devtools/2024/9/23 9:03:47/

书接上回,说一下fragment搭配Viewpager的使用。

  1. 是什么

Fragment已经在卷一整理过了,这里说一下ViewPager,ViewPager是一个可以左右滑动的容器组件,继承自ViewGroup。一般是用在首页banner和详情页的轮播图展示、APP首次使用的新手引导页、还可以在APP首页和Fragment搭配使用。本篇分析fragment搭配Viewpager的使用。

  1. 怎么用

Viewpager需要和Adaper配合使用,通过viewPager.setAdapter(pagerAdapter);

方法可知要传入一个PagerAdapter对象。

三个重要方法:

(1)public void setAdapter(@Nullable PagerAdapter adapter) : 设置ViewPager的适配器。

(2)public void addOnPageChangeListener(@NonNull OnPageChangeListener listener):

设置页面改变事件监听器,可以监听当前页面所在的索引,以及页面滑动具体位置,下面细说。

(3)public void setCurrentItem(int item) :可以设置viewpager显示第几个元素,可以是第几个图片或者fragment。

2.1新建adapter,写一个类继承PagerAdapter

//fragment切换的Viewpageadapter
public class MyPagerAdapter extends FragmentPagerAdapter {private List<Fragment> fragments=new ArrayList<>();private FragmentManager fm;public MyPagerAdapter(FragmentManager fm , List<Fragment> fragments) {super(fm);this.fm=fm;this.fragments.clear();this.fragments.addAll(fragments);}@Overridepublic Fragment getItem(int position) {return fragments.get(position);}@Overridepublic int getCount() {return fragments.size();}}

这里补充一下PagerAdapter是个抽象类,FragmentPagerAdapter FragmentStatePagerAdapter都是它的两个实现类。

FragmentPagerAdapter加载Fragment内存开销比较大,但页面切换比较丝滑;FragmentStatePagerAdapter内存占用少,页面切换效果略逊一筹。我这里就四个Fragment因此用了FragmentPagerAdapter,应用开发中请大家根据实际情况选择。

2.2 准备fragment并设置Adapter

fragmentHome = new FragmentHome();
fragmentApp = new FragmentApp();
fragmentMsg = new FragmentMsg();
fragmentMy = new FragmentMy();//使用Viewpage切换
fragments.add(fragmentHome);
fragments.add(fragmentApp);
fragments.add(fragmentMsg);
fragments.add(fragmentMy);MyPagerAdapter pagerAdapter = new MyPagerAdapter(manager, fragments);
viewPager.setAdapter(pagerAdapter);pagerAdapter.notifyDataSetChanged();

2.3 在Activity的onCreate中设置完adapter以后,展示首页Activity时切换到第一个fragment

//借助Viewpage切换fragment
viewPager.setCurrentItem(0);

2.4设置监听方法

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {Log.e(TAG, "viewPager-onPageScrolled: position=" + position + "   positionOffset=" + positionOffset + "   positionOffsetPixels=" + positionOffsetPixels);}@Overridepublic void onPageSelected(int position) {Log.e(TAG, "viewPager-onPageSelected: position= " + position);viewPager.setCurrentItem(position);}@Overridepublic void onPageScrollStateChanged(int state) {Log.e(TAG, "viewPager-onPageScrollStateChanged:  state=" + state);}
});

3、啥原理

3.1 ViewPager为什么可以滑动?

因为ViewPager重写了View类的computeScroll方法,并在computeScroll中调用onPageScrolled并且里还调用了view的scrollTo实现view滑动,重写view中的这个方法,computeScroll和scrollTo配合专门负责实现滑动的
     

3.2再说三个关键回调方法

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)页面滚动的所以和坐标变化

public void onPageSelected(int position) 一次完整滑动结束以后这个方法返回当前索引,上面的例子时在这里调用 viewPager.setCurrentItem(position);切换了fragment,其实引导页或者详情页轮播图切换时当前页码或者底部小圆点都时在这里进行切换。

public void onPageScrollStateChanged(int state)页面的滑动状态,定义了几个常量值:

   /**
     *       * Indicates that the pager is in an idle, settled state. The current page
     *      * is fully in view and no animation is in progress.
     *      public static final int SCROLL_STATE_IDLE = 0; //滑动停止
     *
     *      * Indicates that the pager is currently being dragged by the user.
     *      public static final int SCROLL_STATE_DRAGGING = 1;  //开始滑动
     *
     *      * Indicates that the pager is in the process of settling to a final position.
     *      public static final int SCROLL_STATE_SETTLING = 2;  //正在滑动
     */

个人总结记录,才疏学浅,如有错误,欢迎指正,多谢。 


http://www.ppmy.cn/devtools/7832.html

相关文章

每日算法4/21

LCR 073. 爱吃香蕉的狒狒 题目 狒狒喜欢吃香蕉。这里有 N 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 H 小时后回来。 狒狒可以决定她吃香蕉的速度 K &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选…

【深度学习-番外1】Win10系统搭建VSCode+Anaconda+Pytorch+CUDA深度学习环境和框架全过程

专栏的老读者们都知道&#xff0c;以前的文章以使用MATLAB的为多。 不过后续陆续开始展开深度学习算法的应用&#xff0c;就会逐渐引入Python语言了&#xff08;当然MATLAB的代码也会同步更新&#xff09;&#xff0c;这是由于在深度学习领域&#xff0c;Python应用更为广泛。…

Redis详解和Spring Data Redis应用

注意事项 如何快速进入命令行窗口什么是配置类 Redis简介 Redis是一个开源的使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value&#xff09…

安卓手机APP开发__媒体开发部分__网络栈

安卓手机APP开发__媒体开发部分__网络栈 目录 概述 配置ExoPlayer来使用一个特定的网络栈 支持的网络栈 Cronet OkHttp 安卓内嵌的网络栈 其它的网络栈

pyqt的人脸识别 基于face_recognition库

参考文献&#xff1a; 1、python face_recognition实现人脸识别系统_python facerecognition检测人脸-CSDN博客 2、cv2.VideoCapture()_cv2.videocapture(0)-CSDN博客 1、camera.py文件代码如下&#xff1b;目录如下 import sys from PyQt5.QtWidgets import QApplication, …

无损以太网的ROCE革命,队列的缓存空间优化分析

ROCE无损以太网&#xff0c;队列的缓存空间优化 多级缓存架构优化芯片性能&#xff1a;* 缓存空间细分为芯片级、端口级和队列级&#xff0c;实现精细管理。* 无损队列引入Headroom缓存空间&#xff0c;确保数据完整性。 在芯片层面&#xff1a; 静态缓存为端口提供保证的缓存空…

富格林:扫清虚假套路实现安全

富格林悉知&#xff0c;黄金一直以来都是投资市场上的宠儿。近期&#xff0c;黄金的投资行情势头很猛&#xff0c;交易机会十分丰富&#xff0c;因此不少场外投资者也纷纷入市操作一番。虽然机会丰富但不可否认现货黄金市场复杂&#xff0c;其中还会掺夹着虚假套路。要想实现安…

Java之继承和多态

继承 一 、继承相关基础 1.1 为什么需要继承 先看下代码 // Dog.java public class Dog { string name ; int age ; float weight ; public void eat (){ System . out . println ( name " 正在吃饭 " ); } public void sleep (){ System . ou…