我们先放一张Hierarchy Viewer的图:(模拟器Android4.4)

看到数字6了吗,那个RelativeLayout是MainActivity的根ViewGroup, 而在RelativeLayout之前还有5层, 即系统默认的界面DecorView(FrameLayout) --> LinearLayout --> FramelLayout-- >ActionBarOverlayLayout --> ContentFrameLayout.

直接说结果吧,用模拟器在API19  也就是Android4.4 上最大可以嵌套39层,包含系统默认的5层,也就说我们最大可以写34层的嵌套。

当嵌套层数达到40层时报如下异常,

10-27 11:38:53.901 25582-25582/com.aquarius.customview E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.aquarius.customview, PID: 25582java.lang.StackOverflowErrorat android.util.Pools$SynchronizedPool.acquire(Pools.java:154)at android.view.GLES20RecordingCanvas.obtain(GLES20RecordingCanvas.java:43)at android.view.GLES20DisplayList.start(GLES20DisplayList.java:61)at android.view.View.getDisplayList(View.java:13323)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.View

View Code

在API23 Android6.0上嵌套层数可以更多,实验了四十多层还依旧没有crash

至于具体低于4.4的版本是什么样的结果,我并没有测试,且Android开源各大手机厂商可能会修改逻辑。不过考虑到向下兼容的问题,还是不应该嵌套太多层数,

当自己写的布局层级超过10层的时候就该考虑优化布局了,因为即使应用不因为嵌套的太多而crash,也会造成渲染时间过长等问题,影响UI流畅度。

转载于:https://www.cnblogs.com/sphere/p/7745687.html

Android 你知道界面布局嵌套多少层之后会Crash吗相关推荐

  1. Android 和 iPhone 界面布局示例

    下图是根据Android和iPhone这两个平台的"生产内容型的应用程序"整理出来的界面布局示例.所对比的4个点,均是两大平台的应用程序常规界面元素. 状态栏: Android和i ...

  2. android开发UI界面布局教学,android UI学习 -- 设置界面的布局(包括style的使用,selector的使用,Checkbox自定义样式,菜单项的样式)...

    最终实现效果如下图: 具体来说就是实现了checkbox自定义选中和为选择样式,菜单项根据不同位置设置不同背景. 先上整体布局文件代码: xmlns:tools="http://schema ...

  3. 【为Android 应用创建 XML 布局】

    上一篇:[Kotlin 中的类和继承] 一.准备工作 在此文章中,您将为一个基本的小费计算器应用构建布局.在此文章结束时,该应用将拥有一个可以运行的界面,但它实际上还无法计算小费.通过接下来的几个文章 ...

  4. 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )

    文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...

  5. Android studio 在线性布局下嵌套相对布局

    Android studio 新建一个项目,修改XML如下: 项目Activity名称为:MyRelativeLayout <?xml version="1.0" encod ...

  6. Android APP字体随系统字体调整造成界面布局混乱问题解决方案

    一.遇到的问题 当用户调整系统字体大小的时候,APP的字体一般也都会跟随改变,进而导致某些界面布局排版混乱. 下面先说一下关于sp单位的理解 sp单位除了受屏幕密度影响外,还受到用户的字体大小影响,通 ...

  7. android 布局分析,关于Android应用程序界面五大布局的图文分析教程

    对于安卓系统应用开发中界面的布局有五大类,分别是LinearLayout(线性布局).FrameLayout(单帧布局).AbsoluteLayout(绝对布局).TablelLayout(表格布局) ...

  8. Android和iPhone应用程序界面布局示例

    下图是根据Android和iPhone这两个平台的"生产内容型的应用程序"整理出来的界面布局示例.所对比的4个点,均是两大平台的应用程序常规界面元素.   状态栏: Android ...

  9. Android精讲--界面编程2(布局管理器)

    为什么需要布局管理器 为了更好地管理Android应用的用户界面里的各种组件,Android提供了布局管理器.通过使用布局管理器,Android应用的图形用户界面具有良好的平台无关性.通常来说,推荐使 ...

最新文章

  1. 关于spring中commons-attributes-compiler.jar的使用问题
  2. 合种侧柏、云杉专车2-3天领证
  3. mysql8.0 zip安装教程
  4. 手把手构建LSTM的向前传播(Building a LSTM step by step)
  5. 报表-对于多数据进行 分sheet以及 分workbook处理
  6. [云炬创业学笔记]第一章创业是什么测试9
  7. Addr、@运算符与Pointer类型
  8. 关于猿如何找对象,心里没点那啥数吗?
  9. 前端学习(3226):回调形式的ref
  10. VMware14.1 Ubuntu16.04安装教程
  11. 第六章 计算机性能测试
  12. 执行容器内的shell_你的Docker容器可能充满了Graboid加密蠕虫
  13. python语言入门q-Python基础教程中的函数
  14. Linux学习总结(72)——Linux系统安全加固
  15. Ajax Loader 图标
  16. Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结
  17. 考试系统分析对比考试系统哪个好
  18. android studio怎么创建布局,Android Studio--活动创建简单布局
  19. 我的微语录周记2012-08-20---2012-…
  20. 羽毛球之混双战术要点

热门文章

  1. 伦理困境:人工智能浪潮与“AI威胁论”之争
  2. vs2012下编码引起的一个神坑
  3. Java箭头函数,lambda函数
  4. 百度paddle学习笔记
  5. 大三Java后端暑期实习面经总结——Java容器篇
  6. 浅析Spring——控制反转IoC
  7. TVM apps extension示例扩展库
  8. Non-Maximum Suppression,NMS非极大值抑制
  9. deeplearning算法优化原理
  10. mysql+3.11.1_【MySql】1.3 使用正则表达式搜索