布局面试问题
1.1 Android 中常用的布局都有哪些?
- FrameLayout
- RelativeLayout
- LinearLayout
- AbsoluteLayout
- TableLayout
- GrideLayout(Android 4.0 推出)
- ConstraintLayout
1.2 谈谈 UI 中, Padding 和 Margin 有什么区别?
android:padding 和 android:layout_margin 的区别,其实概念很简单,padding 是站在父 view 的角度描述问 题,它规定它里面的内容必须与这个父 view 边界的距离。margin 则是站在自己的角度描述问题,规定自己和其他(上下左右)的 view 之间的距离,如果同一级只有一个 view,那么它的效果基本上就和 padding 一样了。
1.3 使用权重如何让一个控件的宽度为父控件的 1/3?
可以在水平方向的 LinearLayout 中设置 weightSum 为 3,然后让其子控件的 weight 为 1,那么该子控件就是 父控件的 1/3。
1.4 Android 中布局的优化措施都有哪些?
这个问题也属于Android 性能优化的一部分。
- 1、尽可能减少布局的嵌套层级
可以使用 sdk 提供的 hierarchyviewer 工具分析视图树,帮助我们发现没有用到的布局。 - 2、不用设置不必要的背景,避免过度绘制 比如父控件设置了背景色,子控件完全将父控件给覆盖的情况下,那么父控件就没有必要设置背景。
- 3、使用<include>标签复用相同的布局代码
- 4、使用<merge>标签减少视图层次结构
该标签主要有两种用法:- 因为所有的 Activity 视图的根节点都是 FrameLayout,因此如果我们的自定义的布局也是 FragmenLayout 的时候那么可以使用 merge 替换。
- 当应用 Include 或者 ViewStub 标签从外部导入 xml 结构时,可以将被导入的 xml 用 merge 作为根节 点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。
<merge>只能作为 xml 布局的根元素。
- 当应用 Include 或者 ViewStub 标签从外部导入 xml 结构时,可以将被导入的 xml 用 merge 作为根节 点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。
- 5、通过<ViewStub>实现 View 的延迟加载
1.5 android:layout_gravity 和 android:gravity 的区别?
android:gravity:设置的是控件自身上面的内容位置 android:layout_gravity:设置控件本身相对于父控件的显示位置。
1.6 关于LinearLayout 的权重算法?
<LinearLayout
android:layout_width="210dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="30dp"
android:layout_height="40dp"
android:layout_weight="1"
android:text="button1" />
<Button
android:layout_width="30dp"
android:layout_height="40dp"
android:layout_weight="1"
android:text="button2" />
<Button
android:layout_width="30dp"
android:layout_height="40dp"
android:layout_weight="2"
android:text="button3" />
</LinearLayout>
如上代码,如何计算出每一个Button的宽度?
布局大小=剩余空间大小权重所占比例+设定的宽度
image.png1.7 scrollView 嵌套 listview 方式除了测量还有什么方法?(了解)
- 手动设置 ListView 高度
经过测试发现,在 xml 中直接指定 ListView 的高度,是可以解决这个问题的,但是 ListView 中的数据是可变的,实际高度还需要实际测量。
于是手动代码设置 ListView 高度的方法就诞生了。 - 使用单个 ListView 取代 ScrollView 中所有内容
如果满足头布局和脚布局的 UI 设计,直接使用 listview 替代 scrollview - 使用 LinearLayout 取代 ListView
既然 ListView 不能适应 ScrollView,那就换一个可以适应 ScrollView 的控件,干嘛非要吊死在 ListView 这一棵树上呢?
而 LinearLayout 是最好的选择。但如果我仍想继续使用已经定义好的 Adater 呢?我们只需要自定 义一个类继承自 LinearLayout,为其加上对 BaseAdapter 的适配。 - 自定义可适应 ScrollView 的 ListView
这个方法和上面的方法是异曲同工,方法 3 是自定义了 LinearLayout 以取代 ListView 的功能,但如果 我脾气就是倔,就是要用 ListView 怎么办?
那就只好自定义一个类继承自 ListView,通过重写其 onMeasure 方法,达到对 ScrollView 适配的效果。
1.8 px、dp、dip、dpi、sp 等到底有什么联系区别
- px (pixels)像素 -- 是像素,就是屏幕上实际的像素点单位。
- dip或dp (device independent pixels)设备独立像素, 与设备屏幕有关。
- sp (scaled pixels — best for text size)放大像素-- 主要处理字体的大小。
- dpi:屏幕像素密度。
1.9 如何将Acitivity中的Window的背景图设置为空?
getWindow().setBackgroundDrawable(null);android的默认背景是不是为空。
2.0 布局适配(理解)
在明白上面基础问题的一些基本概念后,这里总结了一些布局适配的经验。
在Android 中 有4种普遍尺寸:小(small),普通(normal),大(large),超大(xlarge)
常见的普遍分辨率: 低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi) 1080P(xxhdpi)
-
基本设置
在中Menifest中添加子元素
android:anyDensity=”true”时,应用程序安装在不同密度的终端上时,程序会分别加载xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夹中的资源。
相反,如果设为false,即使在文件夹下拥有相同资源,应用不会自动地去相应文件夹下寻找资源 -
适配方案:
-
使用wrap_content、math_parent、weight wrap_content:
根据控件的内容设置控件的尺寸 math_parent:根据父控件的尺寸大小设置控件的尺寸 weight:权重,在线性布局中可以使用weight属性设置控件所占的比例 -
使用相对布局,禁用绝对布局
-
创建不同的layout:每一种layout需要保存在相应的资源目录中,目录以-为后缀命名。例如,对大尺寸屏幕(large screens),一个唯一的layout文件应该保存在res/layout-large/中。
-
使用9-patch PNG图片:当我们需要使图片在拉伸后还能保持一定的显示效果,比如,不能使图片中的重要像素拉伸,不能使内容区域受到拉伸的影响,我们就可以使用.9.png图来实现
-
View 初步了解
-
View是什么?
简单来说,View是Android系统在屏幕上的视觉呈现,也就是说你在手机屏幕上看到的东西都是View。
-
View是如何绘制出来的?
View的绘制流程是从ViewRoot的performTraversals()方法开始,依次经过measure(),layout()和draw()三个过程才最终将一个View绘制出来。
后面的章节会详细讲View 绘制过程,这里只是基础略带一下。
-
View是怎么呈现在界面上的?
Android中的视图都是通过Window来呈现的,不管Activity、Dialog还是Toast它们都有一个Window,然后通过WindowManager来管理View。Window和顶级View——DecorView的通信是依赖ViewRoot完成的。
-
关于Android View控件的理解
Android中控件大致被分为两类ViewGroup,View。ViewGroup作为容器管理View。Android视图,是类似于Dom树的架构。父视图负责测量定位绘制等操作。我们经常在用的findViewById 方法代价昂贵的原因,就是因为他负责至上而下遍历整棵控件树,来寻找View实例,在重复操作中尽量少用。现在在用的很多控件都是直接或者间接继承自View的,为了方便理解可看下图
这里写图片描述 -
View和ViewGroup什么区别?
Android的UI界面都是由View和ViewGroup及其派生类组合而成的。其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的。AndroidUI界面的一般结构可参见
这里写图片描述需要注意的是嵌套次数最好不要超过10层,否则会降低效率,上图是3层
-
Android View刷新机制?
在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成
-
RelativeLayout和LinearLayout性能比较?
1.RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure
2.RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。
3.在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。
-
Android UI界面架构理解
每个Activity,Dialog,Toast都包含一个PhoneWindow对象,PhoneWindow设置DecorView为应用窗口的根视图。在里面就是熟悉的TitleView和ContentView,没错,平时使用的setContentView()就是设置的ContentView。
这里写图片描述
网友评论