Android常见的5个布局,我想大家一定不会陌生。LinearLayout、RelativeLayout和FrameLayout也是使用频率较高的布局方式,做Android开发的一定使用过。
传统的5种布局方式:
不过我的问题并不是问面试者如何使用这些基础的布局,而是要看面试者怎么解决布局嵌套(影响性能)和屏幕适配问题。
我们都清楚Android界面的布局太复杂,嵌套层次过深,会使整个界面的测量、布局和绘制变得更复杂,对性能会造成影响。所以我们在写Layout文件时,也要尽量避免布局的嵌套层次过深的问题。
在怎么解决问题之前,我们得有一个好方法先判断当前的问题情况。Android SDK工具箱中有一个叫做Hierarchy Viewer的工具,能够在App运行时分析Layout。
注意: 在ROOT的手机,或者是安装开发版的ROM的手机可以直接使用Hierarchy Viewer。如果没有Root的手机(SDK 41及以上),需要在你的PC端添加一个环境变量“ANDROID_HVPROTO=ddm”。
下面列举一些面试者常使用的方式。
merge merge标签的作用是合并UI布局,使用该标签能降低UI布局的嵌套层次。
merge标签可用于两种情况:
ViewStub ViewStub标签引入的布局默认不会inflate,既不会显示也不会占用位置。 ViewStub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如数据加载进度布局、出错提示布局等。
需要在使用时手动inflate:
ViewStub在一定的程度可以起到减少嵌套层次的作用,特别是很多时候我们的程序可能不需要走到ViewStub的界面。
include 将可复用的组件抽取出来并通过include标签使用,但<include>标签能减少布局的层次吗?
我认为不能。include主要解决的是相同布局的复用问题,它并不能减少布局的层次。
用RelativeLayout代替LinearLayout
很多人为了减少布局层次喜欢用RelativeLayout代替LinearLayout,不过可能达到的效果并不会很明显。层次是减少了,但本身RelativeLayout就会比LinearLayout性能差一点。
有一些界面,比如一个和一个文本的布局(ListItem常见的布局方式),可以利用TextView有drawableLeft, drawableRight等属性,完全不需要RelativeLayout或者LinearLayout布局。
传统的布局方式存在一定的缺陷,如RelativeLayout要两次测量(measure)它的子View才能知道确切的高度;如果LinearLayout布局的子View有设置了layout_weight,那么它也需要测量两次才能获得布局的高度。
相对于传统的布局方式,Android官方还推出了两种新的布局方式:ConstraintLayout和FlexboxLayout。
ConstraintLayout ConstraintLayout即约束布局,在2016年由Google I/O推出。ConstraintLayout和RelativeLayout有点类似,控件之间根据依赖关系而存在,但比RelativeLayout更加灵活。创建大型复杂的布局仍然可以使用扁平的层级(不用嵌套View Group),说的简单些就是,再复杂的界面也可以只有2层层次。
要使用ConstraintLayout需要在buildgradle中添加相关的support库:
使用ConstraintLayout可以有效的解决布局嵌套过多导致的性能问题,官方也对其渲染性能进行了优化,并且ConstraintLayout支持可视化的方式编写布局。
不过学会熟练使用ConstraintLayout会需要一点时间,但这是值得的。
FlexBoxLayout 做过前端开发(CSS方面)的同学对FlexBox一定不会陌生,最近我在做微信小程序开发时也涉及到FlexBox。FlexBox(d性布局)是w3c在2009年提出的一种新的布局方案,解决以前那种传统css的盒模型的局限性。
Google开源了FlexboxLayout布局和前端CSS FlexBox布局具有相同的功能(肯定有不一样的地方),但已经足够在Android上改进布局的构建方式。
FlexBoxLayout可以理解成一种更高级的LinearLayout,不过比LinearLayout更加强大和灵活。如果我们使用LinearLayout布局的话,那么不同的分辨率,也许我们要重新调整布局,势必会需要跟多的布局文件放在不同的资源目录。而使用FlexBoxLayout来布局的话,它可以适应各种界面的改变(所以叫响应式布局)。
如果对前端的Flexbox不太了解的话,你还需要补一些概念,好在这些东西在网上很容易找到。
可能很多读者会觉这样的面试题是吹毛求疵,很多项目中哪有这么复杂的界面,根本就用不到这些优化措施。
可以说厉害的人,或者叫高手,可能只是比较多在意这些细节而已。在实践中的经历告诉我,很多难于解决的性能问题,并不是因为有一个影响性能的问题无法攻克,而是没有一个明显的制约因素,是有各种小问题一点一点堆积起来,最终积重难返。
所以,把细节做好,或者意识到细节的地方可能引发的问题,对我们解决问题是很有帮助的,不要浪费了让你可以成长的细节。
有需要更多Android高级进阶和面试资料的朋友可以私信我获取
ViewFlipper或者Viewpage 其实就是个View容器
还是用findViewById去找啊,在监听的时候再去改值啊!
用viewFlippergetCurrentView()findById就行了
概述:记录一下常见布局的编写方式。
答:使用recyclerView的网格布局即可。
答:使用别人的开源组件。
应用场景,b站视频的标签,商品标签等等。
答:使用LinearLayout布局,设置weightSum属性,子view设置layout_weight属性。记住需要把设定的宽度或者高度设置0dp。
答:使用RelativeLayout布局,最后一个子View会显示在屏幕的最上方,不会被遮挡,常用来做activity标题头(titlebar)。
答:使用如下属性即可。
答:推荐使用NestedScrllView。
答:参考: >
工具:
apktool,作用:资源文件获取,可以提取出文件和布局文件进行使用查看
dex2jar,作用:将apk反编译成java源码(classesdex转化成jar文件)
jd-gui,作用:查看APK中classesdex转化成出的jar文件,即源码文件
反编译流程:
一、apk反编译得到程序的源代码、、XML配置、语言资源等文件
下载上述工具中的apktool,解压得到3个文件:aaptexe,apktoolbat,apktooljar ,将需要反编译的APK文件放到该目录下,
打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:apktoolbat d -f testapk test
(命令中testapk指的是要反编译的APK文件全名,test为反编译后资源文件存放的目录名称,即为:apktoolbat d -f [apk文件 ] [输出文件夹])
获取成功之后,发现在文件夹下多了个test文件,点击便可以查看该应用的所有资源文件了。
如果你想将反编译完的文件重新打包成apk,那你可以:输入apktoolbat b test(你编译出来文件夹)便可
之后在之前的test文件下便可以发现多了2个文件夹:
build
dist(里面存放着打包出来的APK文件)
二、Apk反编译得到Java源代码
下载上述工具中的dex2jar和jd-gui ,解压
将要反编译的APK后缀名改为rar或则 zip,并解压,得到其中的额classesdex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classesdex放到之前解压出来的工具dex2jar-00915 文件夹内,
在命令行下定位到dex2jarbat所在目录,输入dex2jarbat classesdex,
在改目录下会生成一个classes_dex2jarjar的文件,然后打开工具jd-gui文件夹里的jd-guiexe,之后用该工具打开之前生成的classes_dex2jarjar文件,便可以看到源码了
将布局文件转换成视图,再从中获取那个TextView,再设置监听,
LayoutInflater inflater = LayoutInflaterfrom(this);
View view = inflaterinflate(Rlayoutxxxxx, null);
TextView tv = (TextView)viewfindViewById(Ridtv_xx);
tvsetOnXXXXXXX
1RelativeLayout 相对布局
2 LinearLayout 线性布局
3 FrameLayout 帧布局
4TableLayout 表格布局 (被GridView代替)
5AbsoluteLayoutf 绝对布局(已经被谷歌废弃,几乎不会用到)
相对布局RelativeLayout允许子元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一。
特点:相对于其他空间的位置,和相对父元素的位置进行布局;
layout_centerHorizontal(相当于父节点是水平居中)
layout_centerVertical(相当于父节点是垂直居中)
layout_centerInParent(相当于父节点在正中间)
layout_above(在XX之上)
layout_below(在XX之下)
layout_toLeft(在XX的左边)
layout_toRight(在XX的右边)
layout_alignParentTop(和父节点的顶部对齐)
layout_alignParentBottom(和父节点的底部对齐)
layout_alignParentLeft(和父节点的左边对齐)
layout_alignParentRight(和父节点的右边对齐)
layout_alignTop(和XXX顶部对齐)
layout_alignBottom(和XXX底部对齐)
layout_alignLeft (和XXX左边对齐)
layout_alignRight(和XXX右边对齐)
线性布局LinearLayout是根据指定朝向orientation水平Horizontal或者垂直Vertical方向排列的布局,其最大的特点是可以给子控件按照权重weight属性分配空间
常见案例:计算器
3 FrameLayout 帧布局
通俗的讲就是在屏幕上一层覆盖着一层的控件,在fragment中比较常用
<TextView
android:layout_width= "200px"
android:layout_height= "200px"
android:layout_gravity= "center"
android:background= "#00ff00"
android:gravity= "center" />
以上就是关于关于Android布局你不知道的全部的内容,包括:关于Android布局你不知道的、Android ViewFlipper或者Viewpage里面的布局的控件的ID是怎么样获取的、android布局解决方案(汇总)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)