我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ViewPager2+TabLayout

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ViewPager2+TabLayout

ViewPager2最显著的特点是基于RecyclerView实现,RecyclerView是目前Android端最成熟的AdapterView解决方案,这带来诸多好处:
1、抛弃传统的PagerAdapter,统一了Adapter的API/
2、通过LinearLayoutManager可以实现类似抖音的纵向滑动
3、支持DiffUitl,可以通过diff实现局部刷新
4、支持RTL(right-to-left)布局,对于一些有出海需求的APP非常有用
5、支持ItemDecorator

一、ViewPager2和ViewPager的对比:
1、ViewPager2内部实现是RecyclerView,所以ViewPager2的性能更高。
2、ViewPager2可以实现竖向滑动,ViewPager只能横向滑动。
3、ViewPager2只有一个adapter,FragmentStateAdapter继承自RecyclerView.Adapter。
而ViewPager有两个adapter,FragmentStatePagerAdapter和FragmentPagerAdapter,均是继承PagerAdapter。FragmentStatePagerAdapter和FragmentPagerAdapter两者的区别是FragmentStatePagerAdapter不可以缓存,FragmentPagerAdapter可以缓存。
4、ViewPager2模式实现了懒加载,默认不进行预加载。内部是通过Lifecycle 对 Fragment 的生命周期进行管理。ViewPager会进行预加载,懒加载需要我们自己去实现。


 

效果图:

 MainActivity

public class MainActivity extends AppCompatActivity {    private TabLayout tabLayout;    private ViewPager2 viewPager2;    private int activeColor = Color.parseColor("#ff678f");    private int normalColor = Color.parseColor("#666666");    private int activeSize = 20;    private int normalSize = 14;    private ArrayList fragments;    private TabLayoutMediator mediator;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tabLayout = findViewById(R.id.tab_layout);        viewPager2 = findViewById(R.id.view_pager);        final String[] tabs = new String[]{"关注", "推荐", "最新0", "最新1", "最新2", "最新3", "最新4", "最新5", "最新6"};        //禁用预加载        viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);        //Adapter        viewPager2.setAdapter(new FragmentStateAdapter(getSupportFragmentManager(), getLifecycle()) {            @NonNull            @Override            public Fragment createFragment(int position) {                //FragmentStateAdapter内部自己会管理已实例化的fragment对象。                // 所以不需要考虑复用的问题                return TestFragment.newInstance(tabs[position]);            }            @Override            public int getItemCount() {                return tabs.length;            }        });        //viewPager 页面切换监听监听        viewPager2.registerOnPageChangeCallback(changeCallback);        mediator = new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {            @Override            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {                //这里可以自定义TabView                TextView tabView = new TextView(MainActivity.this);                int[][] states = new int[2][];                states[0] = new int[]{android.R.attr.state_selected};                states[1] = new int[]{};                int[] colors = new int[]{activeColor, normalColor};                ColorStateList colorStateList = new ColorStateList(states, colors);                tabView.setText(tabs[position]);                tabView.setTextSize(normalSize);                tabView.setTextColor(colorStateList);                tab.setCustomView(tabView);            }        });        //要执行这一句才是真正将两者绑定起来        mediator.attach();    }    private ViewPager2.OnPageChangeCallback changeCallback = new ViewPager2.OnPageChangeCallback() {        @Override        public void onPageSelected(int position) {            //可以来设置选中时tab的大小            int tabCount = tabLayout.getTabCount();            for (int i = 0; i < tabCount; i++) {                TabLayout.Tab tab = tabLayout.getTabAt(i);                TextView tabView = (TextView) tab.getCustomView();                if (tab.getPosition() == position) {                    tabView.setTextSize(activeSize);                    tabView.setTypeface(Typeface.DEFAULT_BOLD);                } else {                    tabView.setTextSize(normalSize);                    tabView.setTypeface(Typeface.DEFAULT);                }            }        }    };    @Override    protected void onDestroy() {        mediator.detach();        viewPager2.unregisterOnPageChangeCallback(changeCallback);        super.onDestroy();    }}

activity_main关键代码

        
  •         tabIndicatorColor  指示器颜色
  •         tabIndicatorHeight 指示器高度
  •         tabIndicatorFullWidth  设置为false 则指示器跟文本宽度一致
  •         tabUnboundedRipple 设置为true点击时会有一个水波纹效果
  •         tabGravity 可设置center或fill;center指的是居中显示,fill指的是沾满全屏。
  •         tabMode 可设置fixed和 scrollable;fixed:指的是固定tab;scrollable指的是tab可滑动。
  •         tabTextColor tab文字颜色
  •         tabSelectedTextColor 选中时的tab颜色

viewPager2可以通过设置android:orientation属性来设置切换方向,支持上下、左右切换。

TestFragment

 对应tab页面的实现效果在Fragment中进行实现。

public class TestFragment extends Fragment {    private View rootView;    public static TestFragment newInstance(String text) {        Bundle args = new Bundle();        args.putString("text", text);        TestFragment fragment = new TestFragment();        fragment.setArguments(args);        return fragment;    }    @Nullable    @Override    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        rootView = inflater.inflate(R.layout.fragment_test, container, false);        return rootView;    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        TextView textView = rootView.findViewById(R.id.text_view);        String text = getArguments() != null ? getArguments().getString("text") : null;        textView.setText(text);    }}

几个注意的点!!

  • ViewPager2获取当前fragment,通过mFragmentManager.findFragmentByTag(XXX); tag前面需要拼接“f”

看下源码tag怎么设置的,调用链如下:

FragmentStateAdapter-》onBindViewHolder-》placeFragmentInViewHolder方法
mFragmentManager.beginTransaction()                    .add(fragment, "f" + holder.getItemId())                    .setMaxLifecycle(fragment, STARTED)                    .commitNow();
  • ViewPager.setOffscreenPageLimit()设置预加载与缓存

(1)ViewPager 会预加载几页
(2)ViewPager 会缓存 2*n+1 页(n为设置的值)

如设置为n=1,预加载页数1页,缓存页数3页。如果当前在第一页,会预加载第二页,滑倒第二页,会预加载第三页,当滑倒第三页,第一页会销毁,第四页会加载。

来源地址:https://blog.csdn.net/u013773608/article/details/127997374

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ViewPager2+TabLayout

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

TabLayout如何使用

这篇文章给大家分享的是有关TabLayout如何使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。TabLayout是design库提供的控件,可以方便的使用指示器,功能类似ViewPagerIndicator.
2023-05-30

android TabLayout使用方法详解

Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更
2022-06-06

Android自定义TabLayout效果

周末就要到了,今天项目中遇到这样一个Tab,选中tab的背景是个圆角矩形,方向指向器没有了,这样普通的TabLayout不能满足我的要求,可能会想到动态的去设置选中Tab的背景不就可以了,但是那样的话太生硬了,没有动画效果,其实想想也还比较
2022-06-06

Android控件-TabLayout使用介绍

TabLayout简述简单示例TabLayout属性介绍tabIndicatorFullWidthtabRippleColortabTextAppearancetabModetabIndicatorColortabIndicatorHeig
2022-06-06

Android TabLayout选项卡如何使用

这篇“Android TabLayout选项卡如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android TabL
2023-07-05

Android TabLayout实现京东详情效果

Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更
2022-06-06

Android完全自定义下划线的TabLayout

一 介绍: 导航功能几乎是所有的APP都具备的基础功能之一,Android系统提供了TabLayout+ViewPager的组合来实现该功能。再使用之初,发现该组合真是无敌了,但是。。。总有一些UI设计师觉得原生TabLayout的下划线样
2022-06-06

Android中TabLayout结合ViewPager实现页面切换

一、实现思路 1、在build.gradle中添加依赖,例如: compile 'com.android.support:support-v4:23.4.0' compile 'com.android.support:design:23.4
2022-06-06

Android使用TabLayout+Fragment实现顶部选项卡

先看效果图:使用Tablayout,首先需要在项目中加入Design包dependencies { compile 'com.android.support:design:24.1.1' }
2023-05-31

KotlinFrameLayout与ViewPager2控件实现滚动广告栏方法

这篇文章主要介绍了KotlinFrameLayout与ViewPager2控件实现滚动广告栏,FrameLayout与ViewPager2是Android开发中非常常见的布局组件,并且它不单单是一个帧布局组件,可以用它实现多种功能,感兴趣的朋友一起来看看吧
2022-12-08

Android实现自动变换大小的组件ViewPager2

这篇文章主要介绍了Android实现自动变换大小的组件ViewPager2,ViewPager2最显著的特点是基于RecyclerView实现,RecyclerView是目前Android端最成熟的AdapterView解决方案
2023-03-20

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录