Android 面试题总结之Android 基础(六)

Android 面试题总结之Android 基础(六)

在上一章节Android 面试题总结之Android 基础ListView(五) 主要是ListView的优化,原理以及一些基本问题。java

在阅读过程当中有任何问题,请及时联系。如需转载请注明 fuchenxuan de Blog
本章系《Android 之美 从0到1 – 高手之路》Android基础将会总结了Android 布局常见面试问题。其实对于基础方面Android 开发来讲,常常面试无非就是UI,网络,数据库,这三大方面,本章节总结了笔记经典的问题,但愿对广大Android 开发者,有所帮助。 android

布局面试问题

  1. Android 中经常使用的布局都有哪些?
    • FrameLayout
    • RelativeLayout
    • LinearLayout
    • AbsoluteLayout
    • TableLayout
    • GrideLayout(Android 4.0 推出)
  2. 谈谈 UI 中, Padding 和 Margin 有什么区别?面试

    android:paddingandroid:layout_margin 的区别,其实概念很简单,padding 是站在父 view 的角度描述问 题,它规定它里面的内容必须与这个父 view 边界的距离。margin 则是站在本身的角度描述问题,规定本身和其余(上下左右)的 view 之间的距离,若是同一级只有一个 view,那么它的效果基本上就和 padding 同样了。算法

  3. 使用权重如何让一个控件的宽度为父控件的 1/3?
    能够在水平方向的 LinearLayout 中设置 weightSum 为 3,而后让其子控件的 weight 为 1,那么该子控件就是 父控件的 1/3。
  4. Android 中布局的优化措施都有哪些?
    这个问题也属于Android 性能优化的一部分。
    一、尽量减小布局的嵌套层级
    可使用 sdk 提供的 hierarchyviewer 工具分析视图树,帮助咱们发现没有用到的布局。
    二、不用设置没必要要的背景,避免过分绘制 好比父控件设置了背景色,子控件彻底将父控件给覆盖的状况下,那么父控件就没有必要设置背景。
    三、使用<include>标签复用相同的布局代码
    四、使用<merge>标签减小视图层次结构
    该标签主要有两种用法:
    1) 由于全部的 Activity 视图的根节点都是 FrameLayout,所以若是咱们的自定义的布局也是 FragmenLayout 的时候那么可使用 merge 替换。
    2) 当应用 Include 或者 ViewStub 标签从外部导入 xml 结构时,能够将被导入的 xml 用 merge 做为根节 点表示,这样当被嵌入父级结构中后能够很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。
    <merge>只能做为 xml 布局的根元素。
    五、经过<ViewStub>实现 View 的延迟加载
  5. android:layout_gravity 和 android:gravity 的区别?
    第一个是让该布局在其父控件中的布局方式,第二个是该布局布置其字对象的布局方式。数据库

  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的宽度?markdown

    布局大小=剩余空间大小权重所占比例+设定的宽度网络

    这里写图片描述

  7. scrollView 嵌套 listview 方式除了测量还有什么方法?架构

    1. 手动设置 ListView 高度
      通过测试发现,在 xml 中直接指定 ListView 的高度,是能够解决这个问题的,可是 ListView 中的数据是可变的,实际高度还须要实际测量。
      因而手动代码设置 ListView 高度的方法就诞生了。
    2. 使用单个 ListView 取代 ScrollView 中全部内容
      若是知足头布局和脚布局的 UI 设计,直接使用 listview 替代 scrollview
    3. 使用 LinearLayout 取代 ListView
      既然 ListView 不能适应 ScrollView,那就换一个能够适应 ScrollView 的控件,干吗非要吊死在 ListView 这一棵树上呢?
      而 LinearLayout 是最好的选择。但若是我仍想继续使用已经定义好的 Adater 呢?咱们只须要自定 义一个类继承自 LinearLayout,为其加上对 BaseAdapter 的适配。
    4. 自定义可适应 ScrollView 的 ListView
      这个方法和上面的方法是殊途同归,方法 3 是自定义了 LinearLayout 以取代 ListView 的功能,但若是 我脾气就是倔,就是要用 ListView 怎么办?
      那就只好自定义一个类继承自 ListView,经过重写其 onMeasure 方法,达到对 ScrollView 适配的效果。
  8. dp 和 px 之间的关系?
    dp:是 dip 的简写,指密度无关的像素。 指一个抽象意义上的像素,程序用它来定义界面元素。一个与密度无关的,在逻辑尺寸上,与一个位于像素密度为 160dpi 的屏幕上的像素是一致的。 要把密度无关像素转换为屏幕像素,能够用这样一个简单的公式: pixels=dips*(density/160)。举个例子,在 DPI 为 240 的屏幕上,1 个 DIP 等 于 1.5 个物理像素。
    布局时最好使用 dp 来定义咱们程序的界面,由于这样能够保证咱们的 UI 在各类分辨率的屏幕上均可以正常显示。app

    /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */
    public static int px2dip(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f);
    }
    /** * 根据手机的分辨率从 dip 的单位 转成为 px(像素) */
    public static int dip2px(Context context, float dpValue) {
    final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f);
    }

    因而乎,应该也能理解android项目中的图片资源文件,通常咱们须要在如下几个文件夹中提供不一样大小的图片。

    • xhdpi: 2.0
    • hdpi: 1.5
    • mdpi: 1.0 (baseline)
    • ldpi: 0.75
      若是一张放在mdpi 的图片加载到内存中大小是 10m ,那么遇到hdpi的设备图片加载到内存中大小是15m。
  9. 什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?
    屏幕尺寸是指屏幕对角线的长度。单位是英寸,1英寸=2.54厘米
    屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1像素点,通常是纵向像素横向像素,如1280×720
    屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,像素密度和屏幕尺寸和屏幕分辨率有关。

  10. Android 样式和主题?
    样式(Styles):
    Android 容许在外部样式文件中定义 Android 应用程序的 Look 和 Feel ,你能够将定义好的样式应用在不一样的视图(Views)上。你能够在 XML 文件中定义样式,并将这些样式运用到不一样的组件上。使用XML这种方式定义样式,你只须要配置一些通用的属性,之后若是须要修改样式,能够集中修改。
    属性(Attributes):
    你也能够将单个属性应用到 Android 样式上,一般会在自定义View 的时候,自定义属性。
    主题(Themes):
    主题相比单个视图而言,是应用到整个 Activity 或者 application 的样式

  11. 如何将Acitivity中的Window的背景图设置为空?
    getWindow().setBackgroundDrawable(null);android的默认背景是否是为空。

布局适配

在明白上面基础问题的一些基本概念后,这里总结了一些布局适配的经验。
在Android 中 有4种广泛尺寸:小(small),普通(normal),大(large),超大(xlarge)
常见的广泛分辨率: 低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi) 1080P(xxhdpi)

  • 基本设置
    在中Menifest中添加子元素
    android:anyDensity=”true”时,应用程序安装在不一样密度的终端上时,程序会分别加载xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夹中的资源。
    相反,若是设为false,即便在文件夹下拥有相同资源,应用不会自动地去相应文件夹下寻找资源

  • 适配方案:

    1. 使用wrap_content、math_parent、weight wrap_content:
      根据控件的内容设置控件的尺寸 math_parent:根据父控件的尺寸大小设置控件的尺寸 weight:权重,在线性布局中可使用weight属性设置控件所占的比例
    2. 使用相对布局,禁用绝对布局

    3. 建立不一样的layout:每一种layout须要保存在相应的资源目录中,目录以-为后缀命名。例如,对大尺寸屏幕(large screens),一个惟一的layout文件应该保存在res/layout-large/中。

    4. 使用9-patch PNG图片:当咱们须要使图片在拉伸后还能保持必定的显示效果,好比,不能使图片中的重要像素拉伸,不能使内容区域受到拉伸的影响,咱们就可使用.9.png图来实现

Android Drawable

Drawable属于轻量级的、使用也很简单,Android把可绘制的对象抽象为Drawable,不一样的图形图像资源就表明着不一样的drawable类型, 在实际的开发过程当中使用@drawable来使用drawable资源。关于Drawable更多的请看下图

这里写图片描述

Android 5.0 新特性–使用SVG图片资源
SVG的全称是Scalable Vector Graphics,叫可缩放矢量图形。它和位图(Bitmap)相对,SVG不会像位图同样由于缩放而让图片质量降低。
优势:
* 图片的完美适配。SVG 图像在放大或改变尺寸的状况下其图形质量不会有所损失。这样咱们大大减小了适配所须要的多种分辨率图片,并且可以让图片完美适配多种分辨率,减小了APK包大小并提高了用户体验。
* 尺寸的减少。SVG 是使用XML文件描述的,这种文本格式的图片尺寸很小,并且便于修改。
* 设计上的轻便。在设计方面咱们能够任意修改SVG图片的颜色,这对于某些状况下须要同一张图像但不一样的颜色图片是很是方便的,只须要修改fill颜色就能够了。好比,单击下图片的不一样状态、按钮的背景图片等等。
这里写图片描述

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。
    这里写图片描述

    关于View的内容仍是比较多的,而本文只是做为Android基础的知识点做为初步了解,后面会有专门的章节来说解关于View的更多知识点。

    水平有限,如有错漏,欢迎指正,批评,如需转载,请注明出处–http://blog.csdn.net/vfush,谢谢!

相关文章
相关标签/搜索