热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我们先放一张HierarchyViewer的图:(模拟器Android4.4)看到数字6了吗,那个RelativeLayout是MainActivity的根ViewGroup,而在Relativ

我们先放一张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: main
Process: com.aquarius.customview, PID:
25582
java.lang.StackOverflowError
at 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流畅度。

 


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • SmartRefreshLayout自定义头部刷新和底部加载
    1.添加依赖implementation‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.3’implementation‘com.s ... [详细]
  • 涉及的知识点-ViewGroup的测量与布局-View的测量与布局-滑动冲突的处理-VelocityTracker滑动速率跟踪-Scroller实现弹性滑动-屏幕宽高的获取等实现步 ... [详细]
  • 本文整理了Java中org.apache.ibatis.mapping.ParameterMapping.getNumericScale()方法的一些代码示例,展示了 ... [详细]
author-avatar
冰雪聪明
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有