Android 面试题之基础(不断更新)

布局面试问题

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>标签减少视图层次结构
    该标签主要有两种用法:
      1. 因为所有的 Activity 视图的根节点都是 FrameLayout,因此如果我们的自定义的布局也是 FragmenLayout 的时候那么可以使用 merge 替换。
      1. 当应用 Include 或者 ViewStub 标签从外部导入 xml 结构时,可以将被导入的 xml 用 merge 作为根节 点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。
        <merge>只能作为 xml 布局的根元素。
  • 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.png

1.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 初步了解

  1. View是什么?

    简单来说,View是Android系统在屏幕上的视觉呈现,也就是说你在手机屏幕上看到的东西都是View。

  2. View是如何绘制出来的?

    View的绘制流程是从ViewRoot的performTraversals()方法开始,依次经过measure(),layout()和draw()三个过程才最终将一个View绘制出来。

    后面的章节会详细讲View 绘制过程,这里只是基础略带一下。

  3. View是怎么呈现在界面上的?

    Android中的视图都是通过Window来呈现的,不管Activity、Dialog还是Toast它们都有一个Window,然后通过WindowManager来管理View。Window和顶级View——DecorView的通信是依赖ViewRoot完成的。

  4. 关于Android View控件的理解

    Android中控件大致被分为两类ViewGroup,View。ViewGroup作为容器管理View。Android视图,是类似于Dom树的架构。父视图负责测量定位绘制等操作。我们经常在用的findViewById 方法代价昂贵的原因,就是因为他负责至上而下遍历整棵控件树,来寻找View实例,在重复操作中尽量少用。现在在用的很多控件都是直接或者间接继承自View的,为了方便理解可看下图

    这里写图片描述
  5. View和ViewGroup什么区别?

    Android的UI界面都是由View和ViewGroup及其派生类组合而成的。其中,View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的。AndroidUI界面的一般结构可参见

    这里写图片描述

    需要注意的是嵌套次数最好不要超过10层,否则会降低效率,上图是3层

  6. Android View刷新机制?

    在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成

  7. RelativeLayout和LinearLayout性能比较?

    1.RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure

    2.RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。

    3.在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。

  8. Android UI界面架构理解

    每个Activity,Dialog,Toast都包含一个PhoneWindow对象,PhoneWindow设置DecorView为应用窗口的根视图。在里面就是熟悉的TitleView和ContentView,没错,平时使用的setContentView()就是设置的ContentView。

    这里写图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容