Android高薪之路——Android程序员面试宝典(txt+pdf+epub+mobi电子书下载)


发布时间:2020-10-11 22:54:38

点击下载

作者:李宁(编著)

出版社:信息技术第一出版分社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Android高薪之路——Android程序员面试宝典

Android高薪之路——Android程序员面试宝典试读:

前言

目前,Android已经成为市场占有率很高的移动操作系统。随着大量传统公司、互联网公司、电子设备制造公司以及为数众多的创业公司纷纷加入到Android阵营,人才市场上对Android开发人员的需求很多,促使了许多开发人员加入到 Android 移动开发的大潮中,以期获得令人羡慕的Offer和高薪。

但要想获得高薪工作,首先要过企业面试这一关。由于很多Android开发人员虽然在能力上已经达到了一定的水平,但却是第一次找Android的工作,并不了解Android开发人员面试需要做哪些准备,面试题目的类型是什么样的。对于刚毕业的大学生来说更是如此,要想顺利得到第一份Offer,能提前知道面试问题的类型并加以准备,无疑会加大他们求职的成功率。为此,笔者特意编写了本书。

本书收录了笔者曾经参与出的一些企业的笔试题以及收集到的各大企业关于 Android 的面试题。这些企业既包括了一些从事移动通信业务的国内著名公司,也包括了著名的 IT 企业,以及Android外包单位等。

本书不仅给出了试题和答案,还对比较难以理解的试题进行了解析。这些试题不仅能深入浅出地对解题思路进行分析和指导,而且还能帮助求职者快速复习相关的知识,以便能使求职者在Android面试中应答自如,从而获得一份梦寐以求的高薪工作!

本书特点

详细的分析和广泛的覆盖

国内的企业与国外的企业在面试的要求上不同。国外的企业一般分工比较细,并不要求求职者面面俱到,而国内的企业在面试题上往往考查得比较细,也就是想尽可能全面地了解求职者的水平。而本书正是满足了国内读者的要求,本书所给出的试题尽可能地覆盖了Android应用开发的各个方面,而且大多数试题都有解析部分,读者可以通过这部分内容更深入地理解试题中所包含的技术内容。

专注和细分Android

虽然移动开发领域有很多技术,包括IOS、Windows Phone、HTML5 等,但本书只针对与Android相关的试题。本书将Android中涉及的各个常用技术问题进行筛选和分类,这样读者可以有的放矢,对自己还没有掌握的Android技术进行重点攻破,从而起到事半功倍的效果。

真正的全新Android 试题

本书所给出的Android试题有的是笔者搜集的,也有的是笔者这几年来从事Android企业培训并协助企业招聘Android开发人员所出的试题,而且大多试题都是最近两年的,所以保证了试题的真实性和时效性。读者通过这些试题,可以真正了解企业是如何考查一个Android开发人员的。

扩展性学习

本书的试题除了给出解析和答案外,还通过“扩展知识”使读者了解更多与当前试题相关的技术。如果读者在某一方面没有掌握好,不妨看一看“扩展知识”,这将使你更好地应对企业的面试。

本书内容

本书分为14章,各章的主要内容介绍如下。

本书适合计算机相关专业应届毕业生阅读,也适合作为正在应聘软件行业的相关就业人员和计算机爱好者的参考书。第1章Android 入门

各大企业关于Android的面试题中总免不了会有一些基础的问题。虽然这些问题很多与编程没有直接关系,有的问题也比较抽象,但是一旦碰上了,如果没有准备,还真不知道如何回答更确切,写出的答案总感觉没底。本章将结合各大公司的Android面试题以笔者参与面试的经验对这类问题进行总结。虽然本章的面试题并不能覆盖所有的内容,但读者可以从中学习到回答问题的技巧,可以举一反三地应付这类问题。1.1 关于Android的非技术问题

面试官有时总会问些看似与技术无关的问题,但这些问题也最能体现出应聘者平时是否关注Android,对 Android 了解到什么程度。本节精心挑选了一些这类问题,并给出了参考答案。不过读者要注意,这类问题并没有唯一的答案。在回答面试官这类问题时要根据自己的实际情况来回答。如果真的不知道如何回答,应尽量实话实说,否则可能会给面试官留下不好的印象。1.1.1 为什么看好 Android

这是一个超级经典的问题。这个问题总会一遍一遍不厌其烦地被问到。回答这个问题可从以下几个方面考虑。

Android 的开发商Google 公司的实力。

Google 公司研发Android 的最终目的。

目前移动市场的格局(可以用实际的数据说明)。

Android 的支持者。

Android 和其他移动操作系统的技术分析。

1.Android的开发商Google公司的实力

一款产品的成功往往在很大程度上由这款产品的东家的实力决定,因为无论产品的前景有多么好,都需要企业经常性地投入大量的资金对产品进行继续研发和升级。而 Android 的东家 Google公司就是这样一家非常有实力的互联网企业。出身贵族的Android尽管最终未必会获得空前的成功,但由于它的支持者是Google公司,至少可以大大增强Android的竞争力。

2.Google公司研发Android的最终目的

大家都知道,Google公司并不是一家软件公司(尽管Google公司也开发了很多很牛的软件),而是一家依靠互联网广告起家的互联网公司。Google公司最初研发Android的目的也是希望抢占移动广告市场。目前移动广告市场方兴未艾,如果这个市场可以像今天的传统互联网市场一样火爆,那么Android的前途就不言自明了。

3.目前移动市场的格局

虽然现在移动市场已出现至少超过10种大大小小的移动操作系统。但就目前来看,可能最强的只有Android(Google)、IPhone(iOS、Apple)和Windows Phone 7(Microsoft)。其他的移动操作系统不是开发商没有太多经验,就是实力不行,再不就是支持的软件少。

iPhone 是第一个火起来的智能手机。随着iPhone 的出现,人们了解到了原来手机还可以这么玩。iPhone 问世的最初两年,是根本没有对手的。App Store 中的软件也很快突破10 万大关。但随着Google公司在2008年推出第一款Android手机(G1)后,情形发生了微妙的变化。虽然IPhone的势头仍然很猛,但已不是一家独大了。Android在以前所未有的速度直追IPhone。到2010年底, Android 的出货量已经增加了 886%,而且出货量超过了 Symbian。在 2011 年第二季度,Android在美国智能手机占有率已达到 37%,而 IPhone 仅为 27%。也就是说,从占有率上来说,Android在美国已经领先于IPhone,而在其他地区Android发展的势头也异常猛烈。

至于Windows Phone 7,虽然目前在市场占有率上还远不如Android 和IPhone,但由于微软公司进入移动领域已经超过10年了,而且微软公司实力雄厚,同时又与Nokia公司合作推Windows Phone 7,并且用户对Windows Phone 7 的总体评价很好,所以说Windows PHone 7 很有可能成为Android、IPhone外的第三股力量。

从目前的市场格局来看,Android、IPhone 和Windows Phone 7 最有可能成为移动操作系统的前三甲。而Android成为冠军的可能性更大些(从目前的市场占有率和出货量的增长可以看出这一点)。

注意

IPhone中运行的系统叫iOS,但为了符合习惯,本书中所指的IPhone除了代表智能手机外,也代表了Apple的iOS系统。

4.Android的支持者

Android在最近几年得到了更多的软硬件厂商的支持。这些企业大多来自在Google公司倡导下成立的开放手机联盟(Open Handset Alliance),主要包括Google、eBay、中国移动、宏达电子(HTC)、英特尔、LG、摩托罗拉、高通、Sonic Network、意大利电信、西班牙电信、德州仪器、T-Mobile、ARM、华硕、华为、索尼爱立信、东芝等。

这些企业的大多数都是各自领域的佼佼者。有了他们的支持,Android将会得到更快速的发展。

5.Android和其他移动操作系统的技术分析

Android从问世以来Google公司就将其定位为开源的移动操作系统。用户(包括企业和个人)可以任意修改Android的源代码,而不需要付给Google一分钱的授权费,从而可大大降低研发基于Android手机的成本。不仅如此,开源对于技术人员也有很多好处。只要有足够的能力,就可以尽可能地深入研究Android的源代码,从而对Android的运行原理将有一个更高层次的认识。这一点对于大多数移动操作系统是做不到的。虽然Symbian和Meego也是开源的,但Symbian早已日落西山,开源也是被逼的,再深入研究Symbian,对于大多数移动程序员来说已经没有多大意义了。而Meego自从被Nokia放弃后,就再也没找到强有力的下家,Meego的前途也被蒙上了一层阴影。至于其他的移动操作系统(如IPhone、Windows Phone 7)并未开源,而且Apple 公司不允许其他手机厂商使用iOS 生产iPhone,Windows Phone 7 要收取昂贵的授权费。因此,无论从研发成本,还是从技术上考虑,Android都是移动程序员的不二选择。1.1.2 以前是否从事过Android的工作,做过哪些工作

这个问题主要考察应聘者是否有工作经验(从非技术角度)。面试官也可能问应聘者在以前的公司做过什么,或主要负责了哪些项目。如果应聘者有丰富的经验,这个问题并不难回答。但刚毕业的大学生可能没有太多的工作经验,如果是这种情况,应尽量对面试官说出实情。当然,如果应聘者自己做过一些小的Android程序,也可以让面试官了解自己的经验。1.1.3 你做的最复杂的界面是什么

这个问题也是考查应聘者做项目的经验,尤其是UI方面的设计能力。应聘者可根据自己曾做过的UI描述一下设计步骤和实现过程。例如,如果曾做过游戏程序,可以描述一下游戏界面的设计步骤,其中包括如何使用Photoshop设计最初的界面原形,如何实现程序界面的贴图,游戏背景以及角色如何处理等。1.1.4 如何解决Android学习中遇到的难题

这个问题并不涉及具体的技术,但有经验的面试官通过应聘者对这个问题的回答就可以基本了解应聘者实际的分析和解决问题的能力。因为不管应聘者的知识有多么渊博,技术有多么高,在工作中总会遇到各种各样的新技术,各种各样的难题,因此,快速的学习能力和分析解决问题的能力才是企业更看中的。如果读者在这方面的能力不强,应尽量通过不断地实践来提高这些能力。

由于Android是开放源代码的,因此,解决关于Android的技术问题一般可以通过阅读相关源代码来找到答案。这就涉及如何来查阅源代码,以便找到自己想要的源程序文件。这里举一个例子。假设我们的程序需要获取系统的联系人信息,而我们只知道需要通过Content Provider(Android 的4大应用程序组件之一,用于向其他程序提供数据,在后面的内容将会涉及相关的问题)获得这些信息,但却不知道具体的URI。因此,只需要在Android 源代码中找到相应的Content Provider,就可以很容易获得这些URI。那么关键问题是如何从多达5GB的源代码中找到这些源代码文件呢?我们可以假设 Android SDK 开发人员的习惯是在每一个 Content Provider 类的名称中都加上provider。OK,现在按着这个假设,在Android SDK 源代码中查找包含provider 的文件和目录,我们会找到一大堆(但仍然可以按顺序查找),在其中可以很快找到一个包含ContactsProvider目录中的providers目录,如图1.1所示。现在进入providers\contacts目录,会找到一个ContactsProvider2.java文件。这个文件就是我们要找的 Content Provider 类,现在就可以打开这个文件,并根据 Content Provider类的特征寻找需要的URI了。▲图1.1 寻找指定的Content Provider类

解决其他的技术问题也可以使用类似的方法,也就是根据问题的特征在源代码、官方文档以及Internet中寻找蛛丝马迹。1.1.5 Android只能在手机或其他移动设备上使用吗

Android虽然最初是为以手机为首的移动设备研发的,但由于Android是基于Linux内核的,因此,从理论上说Android可以运行在任何Linux支持的硬件平台上,如平板电脑、PC都可以运行Android。目前已经有一些基于PC的Android 版本开发出,如Android LiveCD、AndroidX86 等。1.2 Android的基本概念

关于Android基本概念的问题在面试题中也会经常出现,有时可能面试官会直接问这些问题。虽然这类问题一般不需要有编程和编程技巧方面的相关知识,但却可以考查应聘者对Android整个体系结构以及基本原理的总体把握。1.2.1 Android的特点都有哪些

这个问题可能总会首先被问到,例如,国内某大型软件公司在2010年的面试题中曾问过这个问题。关于特点的问题一般没有统一的答案,但至少要说出5条以上Android比较优秀或值得关注的特点。例如,下面给出了一些Android的特点供读者参考。

Android 拥有完善的应用程序框架,支持4 大应用组件(Activity、Service、Content Provider和Broadcast),可以在任意层次上进行复用和更换。

虽然Android 的主要编程语言是Java,但Android 中的Java 字节码是运行在Dalvik 虚拟机上的。传统的JVM是基于堆栈的,而Dalvik虚拟机是基于寄存器的,因此,在Dalvik虚拟机上运行的Java程序要比在传统的JVM上运行的Java程序速度更快。

Android 中内置了WebKit 核心的浏览器,支持HTML5 等新的Web 标准。

2D 和3D 绘图功能丰富,支持OpenGLES 2.0,如果手机中带有硬件加速器,3D 图形的渲染会更流畅。

支持轻量级的SQLite 数据库。

支持众多的硬件传感器(如方向传感器、重力传感器、光学传感器、压力传感器等)和其他一些硬件,如蓝牙、3G、Wifi、Camera、GPS等。

支持创新的信息展现方式,如Toast、Notification 等。

刷机更容易。

开源的移动操作系统,研发成本低。

集成的 Eclipse 开发环境和完善的硬件的仿真器(也称为 Android 模拟器)。以及一些用于程序调试、内存和性能分析的工具。1.2.2 MVC模式

到现在为止MVC模式已得到了广泛的应用。各种类型的程序(桌面程序、Web程序、移动程序等)都涉及了 MVC 模式。著名的 Java Web 框架 Struts 就是一套不折不扣的 MVC 框架。MVC的主要目的是使程序中的数据和界面分离,其中M表示模型(Model,也就是数据),V表示视图(View,也就是界面),C 表示控制器(Controller,用于控制 M 和 V 之间的联系)。Android SDK同样也采用了MVC模式来展现数据和界面的关系。

面试例题1:说说MVC 模式的原理,Android SDK 中有哪些组件使用到了MVC 模式,其基本原理是什么?[国内某著名软件外包公司2010年面试题]

答案:MVC的基本原理就是通过Controller连接View和Model。也就是说,当View中显示的数据变化时(如ListView要删除某个列表项),会通知Controller,而不是直接通知Model。这时Controller接到View的通知后,会在Model中采取相应的动作(如删除数据库中的某条记录)。如果模型的数据发生变化(如插入、删除数据库中的记录),会将变化通知控制器,然后控制器会通知视图重新显示数据。MVC的原理如图1.2所示。

使用MVC模式可以将显示部分与数据部分分离,这样当更换视图或模型时可以不影响对方,更有利于程序的维护。

在Android SDK 中使用MVC模式的组件非常多。例如,所有的列表控制(ListView、Spinner、GridView等)都采用MVC模式与数据交互。在Android中MVC中的V就代表这些组件,而M则代表各种数据源以及操作数据库的库。C则代表Adapter类。Android中的Adapter类分很多程度,但都拥有共同的接口。这些Adapter类主要包括BaseAdapter、SimpleAdapter、SimpleCursorAdapter、ArrayAdapter、CursorAdapter等。它们分别对应不同的数据源,例如,ArrayAdapter对应List和数组数据源,而 CursorAdapter 对应 Cursor 对象(一般是从数据库中获取的记录集)。这些 Adapter类都需要使用 getView 方法返回当前列表项显示的 View 对象。当 Model 发生改变时,会调用BaseAdapter.notifyDataSetChanged方法通知组件数据已变化,这时Adapter会调用getView方法用于重新显示组件中的内容。当组件中显示的数据变化时,如删除一个项表项,组件会通过 Adapter中的方法删除Model中相应的记录,然后再调用BaseAdapter.notifyDataSetChanged方法使组件中显示的数据发生变化。总之一句话,无论是数据变化,还是组件中显示的数据发生变化,都需要将Adapter作为桥来达到View和Model之间同步的目的。▲图1.2 MVC 模式的原理1.2.3 Android 的系统构架

这个问题在面试中也会经常遇到。Android的系统构架分为如图1.3所示的4个层次。▲图1.3 Android 的系统构架

4个层次的描述如下。

应用层。该层由运行在Dalvik虚拟机(Google公司为Android专门设计的基于寄存器的Java虚拟机,运行Java程序的速度比JVM更快)上的应用程序(主要由Java语言编写)组成。例如,日历、地图、浏览器、联系人管理,都属于应用层上的程序。

应用框架层。该层主要由View、通知管理器(Notification Manager)、活动管理器(Activity Manager)等由开发人员直接调用的API组成(这些API主要也由Java语言编写)。

系统运行库层。Java 本身是不能直接访问硬件的,要想让 Java 访问硬件,必须使用 NDK才可以。NDK是一些由C/C++语言编写的库(主要是*.so文件)。这些程序也是该层的主要组成部分。该层主要包括C语言标准库、多媒体库、OpenGL ES、SQLite、Webkit、Dalvik 虚拟机等。也就是说,该层是对应用框架层提供支持的层。

Linux内核层。该层主要包括驱动、内存管理、进程管理、网络协议栈等组件。目前Android的版本基于Linux2.6 内核。1.3 开发Android应用程序

开发Android应用程序涉及到很多方面。首先需要下载开发Android应用程序所需的各种SDK和软件。然后利用这些SDK和软件搭建Android开发环境。除此之外,还会涉及到如何使用Android开发环境以及应用程序的发布。本节将就这些内容给出典型的面试题,希望读者先不要看答案,看看自己能否回答这些问题。1.3.1 搭建Android开发环境

要想开发Android应用程序,首先要做的就是选择一个完善的开发环境。目前官方建议Android开发环境是Eclipse+ADT。下面看看关于这方面的一些面试题。

面试例题1:搭建Android开发环境需要些什么?[国内某著名金融企业2009年面试题]

答案:搭建Android开发环境至少需要如下4个SDK和工具。

JDK(建议1.6 及以上版本);

Eclipse(3.4 或以上版本);

Android SDK;

ADT(Android Development Tools,开发Android 程序的Eclipse 插件 )。

面试例题2:如何安装Android SDK?Android SDK 中与Android 版本相关的文件和目录被保存在哪里?[国内某知名金融企业2009年面试题]

答案:到下面的地址下载Android SDK 的最新版本。

http://developer.android.com/sdk/index.html

下载完安装包后,直接按提示安装即可。Android SDK 是在线安装,因此,在安装Android SDK的过程中要保证有稳定而快速的Internet 连接。完全安装Android SDK 需要4GB 左右的空间,因此,在安装Android SDK 之前,要保证有足够的硬盘空间。

所有与 Android 版本相关的内容都保存在\platforms 目录中。例如,\platforms\android-14 目录保存了与Android 4.0(API Level = 14)相关的文件和目录。

面试例题3:如何安装ADT插件?[国内某著名金融企业2009年面试题]

答案:安装ADT插件有如下两种方式:

在线安装;

离线安装。

在线安装需要在Eclipse 中(单击“Help”>“Install New Software”菜单项后,打开“Install”对话框,单击“Add”按钮在弹出的对话框中输入下面的地址)通过如下的地址安装ADT插件。

http://dl-ssl.google.com/android/eclipse

离线安装可以在下面的页面下载ADT插件的zip压缩包,解压后,将解压目录中所有的文件和目录复制到Eclipse的根目录即可。

http://developer.android.com/sdk/eclipse-adt.html#installing1.3.2 Android开发环境的使用

Android的开发环境包括的功能非常多,但经常使用的包括DDMS透视图、traceview、adb服务、截屏等。虽然开发者并不需要掌握所有工具的使用方法,但了解常用工具会对开发工具起很大的作用。在面试题中也会经常涉及到这些工具的使用方法。

面试例题1:DDMS与TraceView的区别。[国内某著名通信公司2011年面试题]

答案:DDMS 透视图包含了多个视图,例如,File Explorer(用于浏览移动设备中的目录和文件)、LogCat(查看调试信息)、Emulator Control(用于控制模拟器)等。也就是说DDMS 是一个集调试、浏览、控制等操作为一体的工具集。而TraceView只是一个性能调优工具。开发人员可以利用该TraceView查看程序中方法的执行效率。

面试例题2:TraceView的使用方法。[国内某著名ERP软件公司2010年面试题]

答案:TraceView是一个性能调优的图形化工具。在使用TraceView之前,使用下面的代码在SD卡上生成一个trace文件。

Debug.startMethodTracing("test");

其中activity_trace是跟踪文件名。执行上面的代码后,会在/sdcard目录生成一个test.trace文件,但字节数为 0。一般在 Activity.onDestroy 方法中执行如下的代码将跟踪结果写入activity_trace.trace文件。

Debug.stopMethodTracing();

将/sdcard目录中的test.trace文件复制到PC上的相应目录(假设复制到了D:\sdcard目录),然后在Windows 控制台输入如下的命令启动TraceView图形化的跟踪界面。

traceview d:\sdcard\test.trace

启动后的图形跟踪界面如图1.4所示(答题时不用给出界面图,只需说明一下TraceView界面中显示的信息即可)。在该界面中显示了从跟踪开始(调用Debug.startMethodTracing方法)到跟踪结束(调用Debug.stopMethodTracing方法)所有方法的调用时间、执行时间、被调用次数等信息,可以利用这些信息对程序进行调优。▲图1.4 TraceView性能跟踪界面

面试例题3:如果adb服务死掉了怎么办?

解析:ADT通过adb服务与模拟器进行通信。由于adb服务并不算稳定,可能在启动较长时间或启动多个模拟器时(一般两个以上)会突然死掉。死掉后ADT就会与模拟器失去联系,例如,无法浏览模拟器中的目录,无法向模拟器发短信。在这种情况下,就需要对adb服务进行重启。

答案:可通过下面的方法重启adb服务。

在DDMS 的Devices 视图右上角菜单中单击“Reset adb”菜单项重启adb 服务。

关闭模拟器,并重新启动。

在任何管理器的“进程”列表中结束adb.exe 进程,然后关闭模拟器,并再次启动模拟器。

如果还是不行,就只有重启Eclipse,甚至重启操作系统了(这种情况很少发生)。第2章布局

布局是所有带界面的Android程序的开端。布局应用得好坏直接决定了程序的用户体验。虽然布局看似没有组件复杂,但也涉及到了很多技巧。在各大公司的面试题中也会经常遇到关于布局的一些问题。通过这些问题可以考查应聘者对界面设计的整体把握。本章并不会对布局的基础知识进行回顾和总结,而是以面试题的形式给出应付这类问题的一些方法和技巧。2.1 Android中的布局

大多数关于布局的面试题都会问到一个熟得不能再熟的问题:介绍一下Android中的布局,或Android中的布局有哪些,请介绍一下它们。关于这类问题并不需要对每一种布局详细阐述,而只需要介绍一下它们的基本用法即可。

面试例题1:请说出 Android 中的五种布局,并简单介绍它们的作用。 [国内某著名软件公司2010年面试题]

答案:五种布局是 FrameLayout(堆栈布局)、LinearLayout(线性布局)、RelativeLayout(相对布局)、TableLayout(表格布局)和AbsoluteLayout(绝对布局)。

FrameLayout在布局文件中使用标签表示。FrameLayout布局中的View都会以层叠方式显示,类似于Photoshop的图层。放在最后的View会显示在最上层。因此,可将FrameLayout称为堆栈布局。

LinearLayout可以将多个View水平或垂直排列。如果android:orientation属性的值为horizontal, View会水平排列。属性值为vertical,View会垂直排列。horizontal是android:orientation属性的默认值。

RelativeLayout 可以通过确定两个或多个组件的相对位置来摆放组件。与组件相对位置相关的属性包括 android:layout_toLeftOf(将当前组件置于该属性指定组件的左侧)、android:layout_toRightOf(将当前组件置于该属性指定组件的右侧)、android:layout_below(将当前组件置于该属性指定组件的下方)和 android:layout_above(将当前组件置于该属性指定组件的上方)。这4个属性值必须指定已经存在的ID。

TableLayout布局可以将View按表格形式排列。AbsoluteLayout可以设置View的绝对坐标,但并不建议使用AbsoluteLayout设计界面,因为这样无法适应屏幕分辨率的变化。

面试例题2:中的xmlns:android是什么意思?xmlns:android的值可以任意设置吗?请说明原因。[美国某著名社交网站2011年面试题]

解析:这道题表面上考查XML命名空间与布局文件的关系,但实际上这个问题可以进一步引申。例如,布局文件的命名空间与自定义组件的关系紧密。可以考查应聘者如何预定义自定义组件的属性。

在自定义组件时,需要使用标签定义属性名,然后需要在布局文件的最顶层标签中指定R.java文件的位置。下面举一个例子。

假设有一个Android程序的package是mobile.android.yd.interview。现在编写一个自定义的组件(EditText组件的扩展,类名为EditTextExt)。首先在res\values目录中建立一个attrs.xml文件,并输入如下内容:

上面的代码在R.attr类中会生成一个attr1变量。如果在布局文件中使用EditTextExt的attr1属性,就需要指定命名空间,代码如下:

xmlns:ext = "http://schemas.android.com/apk/res/mobile.android.yd.interview"

android:orientation="vertical" …>

通过xmlns:ext指定了预定义属性的R.java文件的位置后,在使用EditTextExt组件时,如果属性前加ext命名空间,就必须指定正确的属性。例如,本例中只定义了一个attr1属性,如果要写成ext:attr2,ADT在处理布局文件时会抛出异常。

答案:xmlns:android是XML中的命名空间,为了防止属性冲突。类似于Java中的package。xmlns:android的值不允许任意设置。xmlns:android的值必须以“http://schemas.android.com/apk/res”开头,后面的部分表示定义属性的R.java文件所在的包名。在R.java文件中包含了属性名的定义。例如,如果使用系统属性,需要指定系统R.java文件的位置。该文件位于res\android目录中,因此, xmlns:android值的最后是android。2.2 布局使用技巧

关于布局的面试题最多的是如何使用布局。最常用的布局是 FrameLayout、LinearLayout 和RelativeLayout。这 3 个布局常被用来设计复杂的界面。因此,熟练掌握这 3 个布局的基本技巧更有利于解答这类面试题。2.2.1 FrameLayout布局

面试例题1:FrameLayout的主要用途。

解析:这道题主要考查应聘者对 FrameLayout 的理解程度。FrameLayout 布局中的所有 View都会以叠加的方式摆放,最后一个View会在最上层显示。如果这些View在位置和尺寸上有交集,就会形成类似Photoshop的叠加效果。图2.1是用Photoshop做的效果,包含了3个图层。▲图2.1 用 Photoshop 做的图层效果

如果使用FrameLayout,也同样可以做出类似的效果。只需要将这3个图层的图像分别保存成3个图像文件,并显示在ImageView组件中。将背景图作为FrameLayout的第1个View,其他两个ImageView的顺序可以任意排列。形成的效果如图2.2所示。▲图2.2 用 FrameLayout 做的图层效果

答案:FrameLayout主要用于进行层次结构的布局。例如,想把两个图像叠加到一起形成一张图像的效果就可以用FrameLayout。这种叠加的方式很像Photoshop的图层。

面试例题2:现在有3个按钮,如何让这3个按钮以水平方向分别左对齐、居中对齐和右对齐。[美国某著名通信技术公司2009年面试题]

解析:View 的上、下、左、右、居中对齐是界面中经常接触到的布局效果。单独某种对齐方式有很多种方法。但同一个方向的各种对齐布局,FrameLayout 是最容易实现的。每个 View 对应的XML标签都有一个android:layout_gravity属性,通过设置该属性,可以在FrameLayout中实现任何方向的对齐布局。由于FrameLayout中的View是层叠显示的,因此,可以单独对待FrameLayout中的每一个 View。这一点与 LinearLayout 差异很大。在 LinearLayout 中的 View 并不是对每一个android:layout_gravity属性的值都起作用。如android:orientation属性的值为horizontal,LinearLayout中的View都会水平排列,但View的android:layout_gravity属性只有在垂直(如bottom、center_vertical等)方向的值才起作用。

答案:使用FrameLayout和android:layout_gravity属性可以很容易实现这个布局,代码如下:

android:layout_width="fill_parent" android:layout_height="wrap_content">

面试例题3:FrameLayout中的View都是层叠摆放的,后一个View会覆盖前一个View,这种说法对吗?并说明原因。[国内某著名电信运行商2010年面试题]

答案:不正确。FrameLayout中的View只有在所有的View同样大小,并且在同一个位置时才会被覆盖。否则,View是以层叠方式显示的,类似Photoshop中的图层,未被上一层View覆盖的部分会显示出来。2.2.2 LinearLayout布局

面试例题1:如何获得LinearLayout的宽度和高度?[国内某金融企业2011年面试题]

解析:这个问题从表面看是关于LinearLayout的,实际上也可以扩展到其他继承于View的组件中。很多初学者在回答如何获得组件的宽度和高度时经常容易犯错误。可能使用过其他编程语言的应聘者很自然会直接使用View.getWidth或View.getHeight方法获得宽度和高度。不过很遗憾,在Android程序中这两个方法返回的都是0。由于Android程序的运行机制决定了无法在组件类外部使用getWidth和getHeight方法获得高度和宽度(在自定义组件类的内容可以通过这两个方法获取当前组件的宽度和高度,如在 onSizeChanged 方法中可以使用这两个方法获得宽度和高度),必须使用 View.getMeasuredWidth 和 View.getMeasuredHeight 方法获取当前组件的宽度和高度。在调用这两个方法之前,必须调用View.measure方法先测量组件的宽度和高度。

如果想直接获取在布局文件中定义的组件的宽度和高度,可以直接使用View.getLayoutParams().width 和 View.getLayoutParams().height。当宽度和高度被设为 fill_parent、match_parent 或 wrap_content时,这两个变量会返回MATCH_PARENT、FILL_PARENT和WRAP_CONTENT常量的值。

答案:由于LinearLayout是View的子类,因此,可以使用View.getMeasuredWidth和View.getMeasuredHeight方法获取组件的宽度和高度,代码如下:

View view = getLayoutInflater().inflate(R.layout.main, null);

LinearLayout linearlayout = (LinearLayout)view. findViewById(R.id.linearlayout);

// measure方法的参数值都设为0即可

linearlayout.measure(0, 0);

// 获取组件的宽度

int width = linearlayout. getMeasuredWidth();

// 获取组件的高度

int height = linearlayout.getMeasuredHeight();

注意

如果组件的宽度或高度设为fill_parent或match_parent。使用getMeasuredWidth或getMeasuredHeight方法获取组件宽度或高度时,当组件中包含其他子组件时,所获得的实际值是这些组件所占的最小宽度和最小高度。

面试例题2:如何在多个LinearLayout中添加分隔线?[中国台湾某著名软件公司2011年面试题]

答案:如果要适合于所有的 Android 版本,可以在多个 LinearLayout 放置用于显示分隔线的View,例如,放一个ImageView组件,然后将其背景设为分隔线的颜色或图形,分隔线View的定义代码如下:

android:layout_height="2dp" android:background="#F00" />

在 Android 3.0 及以上版本,LinearLayout 支持直接显示分隔线。设置标签的android:showDividers属性可以在LinearLayout的相应位置显示分隔线。如果有多个LinearLayout,显示效果就和在LinearLayout之间加分隔线是一样的。

android:showDividers属性可以设置如下4个值。

none:不显示分隔线。

beginning:在LinearLayout 的开始处(顶边)显示分隔线。

end:在LinearLayout 的结尾处(底边)显示分隔线。

middle:在LinearLayout 中的每两个组件间显示分隔线。

除了需要设置android:showDeviders属性外,还要设置android:divider属性,该属性表示分隔线的图像,需要一个Drawable ID。

在Java代码中可以使用下面两个方法设置android:showDividers和android:divider。

linearLayout.setShowDividers:设置android:showDividers属性。

linearLayout.setDividerDrawable:设置android:divider 属性。

面试例题3:现在有3个按钮,如何让这3个按钮以水平方向分别左对齐、居中对齐和右对齐?[美国某著名通信技术公司2009年面试题]

解析:在2.2.1节的面试例题2中曾问过这个问题。使用FrameLayout可以很容易解决这个问题。当然,除了用FrameLayout外,还有其他的解决方案。例如,用嵌套的LinearLayout。

由于水平对齐必须将标签的android:orientation属性值设为vertical。因此,可以在一个水平线性布局中放置三个垂直线性布局的LinearLayout,并将 android:layout_weight属性(该属性将在2.3.1节介绍)值设为1,最后将android:layout_width属性值设为fill_parent。这样3个垂直线性布局的LinearLayout就会水平三等分进行排列。然后分别在这3个LinearLayout中各放置一个按钮,分别左对齐、居中对齐和右对齐即可。我们可以将这3个LinearLayout设置成不同的背景色,看一下布局后的效果,如图2.3所示。一般这类问题应聘者只需给出一种答案即可。当然,如果时间允许的话,也可以给出多种答案,这样应聘者有可能得到更多的加分。▲图2.3 使用嵌套线性布局的效果

答案:可以使用嵌套线性布局来解决这个问题,布局代码如下:

android:layout_width="fill_parent" android:layout_height="800dp"

android:orientation="horizontal" >

android:layout_height="wrap_content" android:orientation="vertical"

android:layout_weight="1" android:background="#f00">

android:layout_height="wrap_content" android:orientation="vertical"

android:layout_weight="1" android:background="#0f0">

android:layout_height="wrap_content" android:orientation="vertical"

android:layout_weight="1" android:background="#00f">

2.2.3 RelativeLayout 布局

面试例题1:如图2.4所示的布局如何实现(5个按钮成梅花状排列,并整体水平居中)?[国内某移动领域创业公司2010年面试题]▲图2.4 梅花布局

解析:本题考查对布局的实际应用,需要写出真实的布局代码。一般强调相对位置的布局大多可以使用RelativeLayout布局解决问题,当然,很多时候也需要与其他布局配合使用。例如,本题可以先用RelativeLayout布局安排这5个按钮的位置,然后将RelativeLayout放到FrameLayout或LinearLayout中居中显示。

答案:布局代码如下:

android:layout_width="fill_parent" android:layout_height="fill_parent">

android:layout_height="wrap_content" android:layout_gravity="center_horizontal">

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载