关于Android布局你不知道的

关于Android布局你不知道的,第1张

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布局解决方案(汇总)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9572329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存