最详细的Fragment+ViewPager2使用详解

6 篇文章 0 订阅
订阅专栏

这是实现效果

 

最简单的水平翻页

 学习ViewPager2之前,建议先学习使用Fragment

ViewPager2属于新增的配件,需要在项目的中添加相应的依赖.

implementation 'androidx.viewpager2:viewpager2:1.0.0'

1.碎片布局

首先先创建一个碎片

 

<?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"
    android:background="@color/white"
    tools:context=".BlankFragment"
    android:orientation="vertical">

    <TextView
        android:id="@+id/mTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:gravity="center"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:id="@+id/anotherTextView"
        android:gravity="center"/>


</LinearLayout>

在这里创建了两个TextView

public class BlankFragment extends Fragment {

    private static final String TAG = "BlankFragment";

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    String mTextString1 = "xxx";
    String mTextString2 = "xxx";
    View rootView;

    public static BlankFragment newInstance(String param1, String param2) {
        Log.d(TAG, "newInstance: 从主函数那边调过来创建碎片的实例");

        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate: 在这里创建碎片");
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mTextString1 = getArguments().getString(ARG_PARAM1);
            mTextString2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView: 在这里加载视图");

        if(rootView == null) {
            rootView = inflater.inflate(R.layout.fragment_blank, container, false);
        }
        initView();
        return rootView;
    }

    private void initView() {
        TextView textView = rootView.findViewById(R.id.mTextView);
        TextView textView1 = rootView.findViewById(R.id.anotherTextView);
        textView.setText(mTextString1);
        textView1.setText(mTextString2);
    }
}

这里使用了newInstance来给碎片传入信息,确保传递给碎片的信息不会丢失.

如果你使用了碎片的构造函数来给碎片传递信息,如果此时旋转屏幕,会发生什么呢?

活动的销毁和创建,与此对应碎片也会销毁和创建,系统会自动帮你创建一个碎片,但是在创建碎片的时候只会调用碎片的无参构造函数,此时你向碎片中传递的信息就会丢失.

所以建议使用newInstance来给碎片传递信息

2.适配器

public class MyAdapter extends FragmentStateAdapter {

    private static final String TAG = "MyAdapter";
    List<Fragment> fragments = new ArrayList<>();

    public MyAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List<Fragment> fragments) {
        super(fragmentManager, lifecycle);
        Log.d(TAG, "MyAdapter: 这是那个适配器的构造函数");
        this.fragments = fragments;
        Log.d(TAG, "MyAdapter: ");
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        Log.d(TAG, "createFragment: 看看这是第几个视图" + position);
        return fragments.get(position);
    }

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

3.主布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/myViewPager"
        android:background="@color/purple_500"
        />

</LinearLayout>
public class MainActivity extends AppCompatActivity {
    ViewPager2 viewPager2;

    private List<Fragment> fragments = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initPage();
        viewPager2 = findViewById(R.id.myViewPager);
        MyAdapter myAdapter = new MyAdapter(getSupportFragmentManager(),
                getLifecycle(),fragments);
        viewPager2.setAdapter(myAdapter);
    }

    private void initPage() {
        fragments.add(BlankFragment.newInstance("我最帅","1"));
        fragments.add(BlankFragment.newInstance("我最丑","2"));
        fragments.add(BlankFragment.newInstance("我很帅","3"));
        fragments.add(BlankFragment.newInstance("我很丑","4"));
    }
}

ViewPager的运行结果如下:

 

此时向右边滑动,进入下一个视图

 和TabLayout联动

直接给主布局添加

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/myViewPager"
        android:background="@color/purple_500"
        />

    <com.google.android.material.tabs.TabLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tabLayout"/>

</LinearLayout>

给主活动添加

public class MainActivity extends AppCompatActivity {
    ViewPager2 viewPager2;
    TabLayout tabLayout;

    private List<Fragment> fragments = new ArrayList<>();
    private List<String> tablayoutdata = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initPage();
        viewPager2 = findViewById(R.id.myViewPager);
        MyAdapter myAdapter = new MyAdapter(getSupportFragmentManager(),
                getLifecycle(),fragments);
        viewPager2.setAdapter(myAdapter);

        tabLayout = findViewById(R.id.tabLayout);
        new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                tab.setText(tablayoutdata.get(position));
            }
        }).attach();

    }

    private void initPage() {
        fragments.add(BlankFragment.newInstance("我最帅","1"));
        fragments.add(BlankFragment.newInstance("我最丑","2"));
        fragments.add(BlankFragment.newInstance("我很帅","3"));
        fragments.add(BlankFragment.newInstance("我很丑","4"));

        tablayoutdata.add("1");
        tablayoutdata.add("2");
        tablayoutdata.add("3");
        tablayoutdata.add("4");
    }
}

TabLayout会随着ViewPager滑动滑动,点击TabLayout也会直接跳转到响应的碎片当中.

AndroidViewpage2+fragment实现微信滑动界面的效果
10-16
Android移动应用开发之Viewpage2+fragment实现微信滑动界面的效果
ViewPager+Fragment懒加载问题
12-01
AndroidViewPager+Fragment懒加载问题解决方案AndroidViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
安卓:TabLayout+ViewPager2+Fragment使用(java)
最新发布
qq_72250569的博客
04-27 910
安卓:TabLayout+ViewPager2+Fragment使用(java)
AndroidViewPager2和TabLayout协同使用,实现多Fragment页面切换类似于QQ音乐,bilibili效果
摸鱼小小虫的博客
11-14 4083
ViewPager2和TabLayout协同使用,实现多Fragment页面切换类似于QQ音乐,bilibili效果,实现滑动切换界面的效果
ViewPager2+Fragment操作笔记
2401_84118608的博客
04-05 731
上滑吸顶+标题页面左右滑动+横滑和竖滑列表+标题页面数据和数量更新上滑吸顶左右滑动ViewPager2TabLayoutFragment横滑和竖滑列表标题页面数据和数量+声明周期检测+缓存优化。
ViewPager2+Fragment
victorrrrt的博客
06-30 7698
ViewPager2使用和介绍
ViewPager2 系列-- 初探ViewPager2
xiaokangss的博客
06-19 6241
ViewPager2Android Jetpack库中的一个组件,是用于在应用程序中实现页面切换和滑动效果的容器。可以应用于多种场景中,提供了灵活的页面切换和布局定制功能,使得应用程序界面更加丰富和交互性强,可以用于以下场景:
ViewPager2Fragment的组合使用
热门推荐
m0_47761892的博客
07-29 2万+
2019年11月20号,期待已久的ViewPager2 正式版终于发布了! 一、ViewPager2的新特性 ViewPager2从名字就可以看出来它是ViewPager的升级版,既然是升级版那么它相比ViewPager有哪些新功能和哪些API变化呢?我们接着往下看。 1.ViewPager2新特性 基于RecyclerView实现。这意味着RecyclerView的优点将会被ViewPager2所继承。支持竖直滑动。只需要一个参数就可以改变滑动方向。支持关闭用户输入。通过setUserInputEnabl
从0开始讲解FragmentViewPager2的结合使用(2):混合使用
Android小白
04-07 4356
ViewPager2的基本使用 ViewPager2相对于ViewPager1,相当于是对RecyclerView做了一个封装,所以在代码里面会发现很多RecyclerView的身影,而且在ViewPager2的源码中也可以找到RecyclerView变量 首先在MainActivity的XML文件中加载ViewPager2 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas
ViewPager2+Fragment操作笔记(1)
2401_84132723的博客
04-05 960
ViewPager2官网介绍ViewPager2官网Samples距离ViewPager2正式版的发布已经一年多了,目前ViewPager早已停止更新,官方鼓励使用ViewPager2替代。ViewPager2底层基于实现,因此可以获得抛弃传统的,统一了Adapter的API;横向、竖向布局都可以实现自由滑动;支持DiffUitl,可以实现局部刷新;支持RTL(right-to-left),对于一些有出海需求的APP非常有用;支持,搭配实现炫酷的跳转动画;ViewPager2更多的是配合。
Android实现ViewPager+Fragment左右滑动
03-09
Android实现ViewPager+Fragment左右滑动
详解Androidfragmentviewpager的那点事儿
01-04
在之前的博文《Android使用 ViewPager实现屏幕页面切换和页面轮播效果》和《详解AndroidFragment的两种创建方式》以及《Androidfragment与activity之间的交互(两种实现方式)》中我们介绍了ViewPager以及...
Android Fragment滑动组件ViewPager的实例详解
08-30
Android Fragment 滑动组件 ViewPager 的实例详解 Android Fragment 滑动组件 ViewPager 是 Android 开发中常用的滑动组件,能够帮助开发者快速创建滑动式用户界面。下面是对 Android Fragment 滑动组件 ViewPager ...
详解AndroidViewPager 中使用 Fragment 的懒加载
08-30
AndroidViewPager 中使用 Fragment 的懒加载详解 Android 开发中,ViewPager 是一个常用的组件,用于实现页面的滑动和切换,而 Fragment 则是 Android 中的一种基本组件,用于实现页面的逻辑单元。那么,在 ...
ViewPager2+Fragment实现懒加载
u011210902的博客
09-09 2775
ViewPager2+Fragment实现懒加载
viewPager2实现fragment滑动
weixin_43459124的博客
11-29 2277
1.创建ViewPager2 ViewPager是一个容器,需要用来滑动的几个fragment放在ViewPager中,在ViewPager容器内的fragment可以通过ViewPager给的方法实现滑动。 ViewPager2ViewPager升级版,Google的文档推荐用新版,本文所有的ViewPager都指的是ViewPager2这个新版,使用需要添加依赖,在module的build.gradle中添加: dependencies { implementation "androidx.v
Android Studio ViewPager2+Fragment实现无限滑动效果
qq_51135645的博客
08-04 3629
通过ViewPager2的onPageSelected监听实现ViewPager2+Fragment的无限滑动效果
ViewPager和ViewPager2的简单使用,TabLayout与ViewPager2联用以及轮播图的实现。
m0_74000465的博客
10-29 1302
ViewPager和ViewPager2的简单使用,TabLayout和ViewPager2的联用以及轮播图的实现代码。
fragment+viewpager
03-16
FragmentViewPager是Android开发中常用的两个组件。 Fragment是一种可以嵌入到Activity中的模块化组件,可以独立管理自己的生命周期和UI界面。ViewPager是一种可以滑动切换多个Fragment的组件,常用于实现滑动页面效果。 在使用ViewPager时,通常会将多个Fragment作为ViewPager的子页面,通过滑动ViewPager来切换不同的Fragment。这种方式可以方便地实现多个页面之间的切换和交互。 同时,ViewPager也可以与TabLayout等组件结合使用,实现更加丰富的页面效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 安卓活动(Activity)基本介绍和用法 37237
  • 最详细的主界面ViewPager2 使用详解 9797
  • Java中的命名规范 5608
  • 最详细的Fragment+ViewPager2使用详解 4589
  • 安卓滚动控件(ListView)基本介绍和用法 3022

分类专栏

  • 安卓 2篇
  • Java 6篇
  • C语言 3篇

最新评论

  • 从源码看Jetpack(一)Lifecycle八股一图流

    CSDN-Ada助手: 恭喜你写了第18篇博客!标题看起来很有吸引力,尤其是"Jetpack(一)Lifecycle八股一图流"这样的专业标题。我很期待阅读你的博客,深入了解Jetpack的源码。不过,作为下一步的创作建议,我想提醒你在文章中尽量保持谦虚的语气,这样读者更容易接受你的观点,并且愿意与你进行更深入的讨论。继续加油,期待你的下一篇博客!

  • OKhttp源码

    龙战于野渭南: 太强了吧表情包表情包表情包

  • ViewModel和LiveData的基本使用

    qiongqiong421122: 最后一句有点多余了,因为viewmodel本来就不是为了持久化而提出的;它要解决的是内存级数据在activity或fragment的生命周期内的保持问题。

  • 安卓进阶之光---View体系与自定义体系---上

    老师好我是王同学381: 艹,你怎么会看到表情包

  • 安卓进阶之光---View体系与自定义体系---上

    龙战于野渭南: 哥哥太强了表情包表情包表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 从源码看安卓开源库(三)Retrofit八股一图流
  • 从源码看安卓开源库(二)EventBus八股一图流
  • 从源码看安卓开源库(一)OkHttp八股一图流
2023年8篇
2022年15篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司沙井网页制作西乡设计公司网站西乡网站推广工具大运模板制作坪地建设网站福田网站制作设计永湖优化南澳建网站南山企业网站制作石岩百度竞价包年推广大芬关键词按天计费同乐网站制作广州seo网站优化龙华关键词按天计费南山百度竞价西乡企业网站设计横岗网站搜索优化沙井网站优化按天计费南联网络推广福永网站设计宝安网站seo优化南澳设计公司网站观澜营销型网站建设广州网络推广龙岗网站推广系统大芬seo网站优化广州企业网站设计坪地英文网站建设坂田百度网站优化大运关键词排名歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化