当前位置: 首页 > news >正文

Android NestedScrollView+TabLayout+ViewPager+ 其它布局,ViewPager 不显示以及超出屏幕不显示问题

前言

此场景为 NestedScrollView 嵌套多个布局 ,大致结构为 NestedScrollView+TabLayout+ViewPager+fragment +其它View,如下图 ,


一、ViewPager 设置高度才会显示内容问题

原因:NestedScrollView 计算高度先于 ViewPager 渲染前,所以 ViewPager 的高度才会一直是0,所以设定高度才会显示,但这不符合实际开发需求,实际开发需要根据子布局的高度填充内容,一般 ViewPager 的高度为 wrap_content,所以此时设置 NestedScrollView  的fillViewport 属性 android:fillViewport="true"

    <android.support.v4.widget.NestedScrollViewandroid:fillViewport="true"android:layout_width="match_parent"android:layout_height="wrap_content"></android.support.v4.widget.NestedScrollView>

二、其它View 超出屏幕不显示问题

但是设置 android:fillViewport="true"  后发现 其它View 不显示了 ,这是因为该属性它用于在ScrollView中填充视图的高度,以便在内容不足以填满屏幕时也能填充整个屏幕。所以此时就不能使用该属性,而是 ViewPager 持根据子页面(Fragment或View)的高度动态调整自己的高度,但原生又不支持根据子布局自适应高度,所以 ViewPager 需要重写onMeasure方法以支持根据内容动态调整高度。

public class DynamicHeightViewPager extends ViewPager {public DynamicHeightViewPager(Context context) {super(context);}public DynamicHeightViewPager(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int height = 0;for (int i = 0; i < getChildCount(); i++) {View child = getChildAt(i);child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec((int) Math.max(height, child.getMeasuredHeight()), MeasureSpec.UNSPECIFIED));height = Math.max(height, child.getMeasuredHeight());}super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));}
}

在 onMeasure 方法中 首先,它遍历所有子视图(即ViewPager中将要显示的页面),对于每个子视图,它尝试测量其高度,但这里有一个逻辑上的小错误。在第一次调用child.measure时,child.getMeasuredHeight()很可能为0,因为子视图还没有被真正测量过。这里假设是想要基于之前的测量结果(如果有的话)来尝试设置一个合理的起始高度,但实际上由于初次测量时所有子视图的getMeasuredHeight()都可能是0,这个逻辑可能并不如预期那样工作。一个更稳妥的做法是直接给子视图一个较大的初始高度或完全不受限制的高度(如MeasureSpec.UNSPECIFIED),然后根据实际需要调整。然后,它更新height变量为当前找到的最大子视图高度。最后,它使用找到的最大高度作为ViewPager的高度,并调用super.onMeasure来设置最终的测量规格,

在布局中直接替换 ViewPager 即可,


总结

如果对你有所帮助的话,不妨 点赞收藏
如果你有什么疑问的话,不妨 评论私信
青山不改,绿水长流 ,有缘江湖再见 ~

http://www.lryc.cn/news/446829.html

相关文章:

  • Linux开机logo设置
  • webpack插件开发 模拟vue系统登录后,获取a标签下的文件
  • 大规模数据处理:分库分表与数据迁移最佳实践
  • TCP网络编程概述、相关函数、及实现超详解
  • Cluade 3.5 Sonnet 提示词泄露
  • git clone代码报错Permission denied (publickey)
  • QT设计中文输入法软键盘DLL给到C#开发步骤
  • 使用 Rust 和 wasm-pack 开发 WebAssembly 应用
  • 1. IP地址介绍
  • 喜报来袭~又有一波优秀企业选择Smartbi
  • Web端云剪辑解决方案,BS架构私有化部署,安全可控
  • AI 代码助手插件推荐
  • word中的表格全部设置宽度100%
  • JFinal整合Websocket
  • (done) 声音信号处理基础知识(7) (Understanding Time Domain Audio Features)
  • 拓数派荣获上海数据交易所“数据治理服务商”认证
  • 【Redis】分布式锁之 Redission
  • 对象序列化
  • 什么是专利开放许可?
  • 地表最强开源大模型!Llama 3.2,如何让你的手机变身私人智能助理
  • Pandas中DataFrame表格型数据结构
  • C++的智能指针
  • 微信小程序showLoading ,showToast ,hideLoading连续调用出现showLoading 不关闭的情况记录
  • OpenFeign使用详解
  • CSS clip-path 属性的使用
  • PHP 函数
  • NCEloss与InfoNCEloss的区别
  • 高通Android 12 push framework.jar和service.jar
  • HTTPS证书配置
  • Image matting入门