第六章:ViewPager2使用和启动白屏优化,技术协会安卓部面试

2023-05-16

{

“activeSize”: 16,

“normalSize”: 14,

“activeColor”: “#ED7282”,

“normalColor”: “#666666”,

“select”: 0,

“tabGravity”: 0,

“tabs”: [

{

“title”: “图片”,

“index”: 0,

“tag”: “pics”,

“enable”: true

},

{

“title”: “视频”,

“index”: 1,

“tag”: “video”,

“enable”: true

},

{

“title”: “文本”,

“index”: 1,

“tag”: “text”,

“enable”: true

}

]

}

  • 解析json文件

/**

  • 获取普通导航栏

  • @return

*/

public static SofaTab getSofaTabConfig() {

if (sSofaTab == null) {

String content = parseFile(“sofa_tabs_config.json”);

sSofaTab = JSON.parseObject(content, SofaTab.class);

Collections.sort(sSofaTab.getTabs(), (o1, o2) -> {

return o1.getIndex() < o2.getIndex() ? -1 : 1;

});

}

return sSofaTab;

}

private static String parseFile(String fileName) {

AssetManager assets = AppGlobals.getApplication().getAssets();

InputStream is = null;

BufferedReader br = null;

StringBuilder builder = new StringBuilder();

try {

is = assets.open(fileName);

br = new BufferedReader(new InputStreamReader(is));

String line = null;

while ((line = br.readLine()) != null) {

builder.append(line);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (is != null) {

is.close();

}

if (br != null) {

br.close();

}

} catch (Exception e) {

}

}

return builder.toString();

}

  • 布局
<?xml version="1.0" encoding="utf-8"?>

<layout 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”>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”

tools:context=".ui.sofa.SofaFragment">

<com.google.android.material.tabs.TabLayout

android:id="@+id/tab_layout"

android:layout_width=“match_parent”

android:layout_height="@dimen/dp_45"

app:tabGravity=“center”

app:tabIndicatorColor="
@color/color_theme"

app:tabIndicatorFullWidth=“false”

app:tabIndicatorHeight="@dimen/dp_2"

app:tabInlineLabel=“true”

app:tabMode=“scrollable”

app:tabSelectedTextColor="@color/color_theme"

app:tabTextColor="@color/color_333"

app:tabUnboundedRipple=“true” />

<androidx.viewpager2.widget.ViewPager2

android:id="@+id/view_pager"

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“horizontal” />

  • 使用

@FragmentDestination(pageUrl = “main/tabs/sofa”, asStarter = false)

public class SofaFragment extends Fragment {

private FragmentSofaBinding binding;

private List<SofaTab.TabsBean> tabsList;

private List mFragments = new ArrayList<>();

private TabLayoutMediator mediator;

private SofaTab tabConfig;

public View onCreateView(@NonNull LayoutInflater inflater,

ViewGroup container, Bundle savedInstanceState) {

binding = FragmentSofaBinding.inflate(inflater, container, false);

return binding.getRoot();

}

@SuppressLint(“WrongConstant”)

@Override

public void onActivityCreated(@Nullable Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

mFragments.clear();

mFragments.add(BlankFragment.newInstance(“图片”));

mFragments.add(BlankFragment.newInstance(“视频”));

mFragments.add(BlankFragment.newInstance(“文本”));

tabConfig = getTabConfig();

tabsList = new CopyOnWriteArrayList<>();

for (SofaTab.TabsBean tab : tabConfig.getTabs()) {

if (tab.isEnable()) {

tabsList.add(tab);

}

}

//限制页面预加载

binding.viewPager.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);

//viewPager2默认只有一种类型的Adapter。FragmentStateAdapter

//并且在页面切换的时候 不会调用子Fragment的setUserVisibleHint ,取而代之的是onPause(),onResume()、

binding.viewPager.setAdapter(new FragmentStateAdapter(getChildFragmentManager(), this.getLifecycle()) {

@NonNull

@Override

public Fragment createFragment(int position) {

return getTabFragment(position);

}

@Override

public int getItemCount() {

return tabsList.size();

}

});

/**

  • 1 MODE_FIXED //表示宽度始终是tablayout控件指定的宽度,如果标签过多,那么就无限挤压控件

  • 0 MODE_SCROLLABLE //表示每个标签都保持自身宽度,一旦标签过多,给标题栏提供支持横向滑动的功能

*/

binding.tabLayout.setTabGravity(tabConfig.getTabGravity());

//viewPager2 就不能和再用TabLayout.setUpWithViewPager()了

//取而代之的是TabLayoutMediator。我们可以在onConfigureTab()方法的回调里面 做tab标签的配置

//其中autoRefresh的意思是:如果viewPager2 中child的数量发生了变化,也即我们调用了adapter#notifyItemChanged()前后getItemCount不同。

//要不要 重新刷野tabLayout的tab标签。视情况而定,像咱们sofaFragment的tab数量一旦固定了是不会变的,传true/false 都问题不大

mediator = new TabLayoutMediator(binding.tabLayout, binding.viewPager, false, (tab, position) -> {

tab.setCustomView(makeTabView(position));

});

mediator.attach();

binding.viewPager.registerOnPageChangeCallback(mPageChangeCallback);

//切换到默认选择项,那当然要等待初始化完成之后才有效

binding.viewPager.post(() -> binding.viewPager.setCurrentItem(tabConfig.getSelect(), false));

}

/**

  • 自定义tab的view内容

  • @param position

  • @return
    or(binding.tabLayout, binding.viewPager, false, (tab, position) -> {

tab.setCustomView(makeTabView(position));

});

mediator.attach();

binding.viewPager.registerOnPageChangeCallback(mPageChangeCallback);

//切换到默认选择项,那当然要等待初始化完成之后才有效

binding.viewPager.post(() -> binding.viewPager.setCurrentItem(tabConfig.getSelect(), false));

}

/**

  • 自定义tab的view内容

  • @param position

  • @return

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第六章:ViewPager2使用和启动白屏优化,技术协会安卓部面试 的相关文章

  • Android _ ViewBinding 与 Kotlin 委托双剑合璧,从思维图到基础再到深入

    lt LinearLayout tools viewBindingIgnore 61 true gt 3 2 创建绑定类 有三个创建绑定类的 API xff1a fun bind view View T fun inflate inflat
  • Android语音播报、后台播报、语音识别,android程序开发

    lt xml version 61 34 1 0 34 encoding 61 34 gt Android学习笔记总结 43 最新移动架构视频 43 大厂安卓面试真题 43 项目实战源码讲义 gt gt docs qq com doc DS
  • Spring框架介绍和使用

    一 Spring框架介绍 1 Spring简介 Spring是2003年兴起的一个Java轻量级框架 xff0c 它是为解决企业级开发的复杂性而创建的一个框架 它是一个分层的JavaSE EE Full Stack xff08 一站式 xf
  • SpringMVC注解开发运行原理

    服务器初始化过程 xff1a 1 xff1a 服务器初始化 加载继承 AbstractDispatcherServletInitializer即springmvc定义的代替web xml的 类初始化web容器 然后重写三个方法 xff1a
  • Unity3d游戏开发之C#开发(一)

    概要 撰写原因 xff1a 当今市面上关于Unity的教程的脚本几乎都是用js来当做教程语言的 xff0c 因为js比较容易学习 xff0c 所以如果是新学的朋友建议学js的版本 xff0c 如有特殊要求需要学习C 写脚本的话那么这系列文章
  • Spring配置文件详解

    Spring配置文件详解 1 spring的配置文件详解 Bean标签基本配置 用于配置对象让 spring 来创建的 默认情况下它调用的是类中的无参构造函数 如果没有无参构造函数则不能创建成功 属性 xff1a id 给对象在容器之中提供
  • [WinError 10061] 由于目标计算机积极拒绝,无法连接。解决办法

    相信来到这的人一定遇到这样的情况 xff0c 十分的难受 这里给大家总结了三种方法 xff0c 看看能不能解决大家的困难 1 代理问题 大家看看自己是不是因为正在搞东西 xff0c 列如 xff1a burpsuite xff0c 设置了代
  • 快速解决eclipse无法启动,一启动就报错,且整个项目显示红色感叹号和×

    eclipse中由于没有适配的server xff0c 所以需要用Tomcat来支持项目的运行 xff0c 也会出现各种各样的错误 xff0c 比如eclipse无法启动 xff0c 整个项目显示红色 xff01 和红色 该如何解决 xff
  • un7.10:在IDEA中使用若依框架实现增删改查功能。

    在java的世界中 xff0c 有很多框架提供我们使用 xff0c 今天我们就来讲一讲若依框架 若依框架是一款非常便捷的框架 xff0c 他相对于spring boot框架而言 xff0c 显得更为简单 xff0c 更为便捷 xff0c 比
  • docker常用操作命令。

    docker是一款基于Linux之上的容器 xff0c 由于它的抽象层比虚拟机少 xff0c 而且利用的是主机内流 xff0c 不需要价值操作系统的内核 xff0c 所以它比传统的虚拟机更快 xff0c 所以越来越多的人选择用docker了
  • un8.21:用html实现增删改查功能(代码篇)。

    在项目中 xff0c 我们不仅要在后端代码实现增删改查的功能 xff0c 前端也是必不可少的 xff0c 那么在前端页面中应该如何实现完整的一套增删该查呢 xff1f 接下来附上代码 xff0c 之后的文章里会有详解 一 在html中写出大
  • 达梦(DM)数据库介绍。

    达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统 简称DM 达梦数据库也属于关系型数据库 xff0c 主要有以下几个概念 数据库 实例 用户 表空间 模式 表 角色 数据文件 DM8采用全新的体系架构 xff0c
  • @TableId注解详细介绍

    64 TableId注解是专门用在主键上的注解 xff0c 如果数据库中的主键字段名和实体中的属性名 xff0c 不一样且不是驼峰之类的对应关系 xff0c 可以在实体中表示主键的属性上加 64 Tableid注解 xff0c 并指定 64
  • mybatis-plus自动填充功能

    有些时候我们可能会有这样的需求 xff0c 插入或者更新数据时 xff0c 希望有些字段可以自动填充数据 xff0c 比如密码 version等 在MP中提供了这样的功能 xff0c 可以实现自动填充 一 添加 64 TableField注
  • mybatis-plus之逻辑删除及通用枚举

    开发系统时 xff0c 有时候在实现功能时 xff0c 删除操作需要实现逻辑删除 xff0c 所谓逻辑删除就是将数据标记为删除 xff0c 而并非真正的物理删除 xff08 非delete操作 xff09 xff0c 查询时需要携带状态条件
  • MATLAB R2014b 的安装破解

    注 xff1a 本博文纯供技术学习之用 xff0c 无意侵权 xff0c 请不要传播转载并在破解24小时之内删除 提要 xff1a 因为考虑到数学建模和日常的数学学习只用安装的matlab xff0c 现在我了解的最新的应该就是matlab
  • 解决Field ‘name‘ doesn‘t have a default value报错

    今天写代码的时候报错Field 39 name 39 doesn 39 t have a default value xff0c 如下图 xff1a 是数据库属性字段没有赋初值 xff0c 然后我就去看数据库 xff0c 发现数据库 先说解
  • 仿macos风格的windows11桌面(适用win10,win11,齐全模板与配件,及相关问题解决方案)

    仿macos风格的windows11桌面在一定程度上加大了对win11的美化同时在原有的操作风格上对win11也进行了风格上的统一 xff0c 废话不多说 xff0c 先上效果图 是不是一眼就有所心动呢 xff0c 先介绍一下这个桌面上真正
  • retina屏是什么意思(Retina屏和一般显示屏幕的区别)

    可能许多比较关注电脑方面的信息或者有关于苹果的消息的小伙伴们都听说过 34 Retina 34 这个词 苹果手机 xff0c Retina视网膜屏幕 xff0c 是指人眼在正常观察距离下 xff0c 视网膜无法区分单个像素 xff0c 不再
  • 新员工-产品经理如何上手一个新产品,进行产品规划并开始工作

    产品规划 nbsp nbsp nbsp 是指产品规划人员通过调查研究 在研究市场 探寻客户 消费者需求 分析竞争对手 衡量外在机会与风险 以及对市场和技术发展态势综合研究的基础上 根据公司自身的情况和发展方向 制定出可以把握市场机会 满足消

随机推荐