2界面设计
Android应用开发的一项重要内容就是界面开发。对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户。
2.1 UI设计概述
Android系统按照MVC(模型(model)-视图(view)-控制器(controller))设计模式将应用程序的界面设计与功能控制设计分离,类似于前后端分离,而在AS中,前端的界面布局文件是在生成的应用程序框架项目的res资源目录的layout子目录中。
res/layout目录下存放定义UI设计的XML文件。UI设计有两种方式:一种是在Text视图方式下,在XML文件中,可以直接写布局及控件代码;另一种在Design视图方式下,拖拽控件至设计区域。
UI设计有Design和Text两种视图模式,根据需要可以随时切换。使用约束布局时,在Design模式下拖控件后,应及时切换至Text模式,在修改控件id后回到Design,使用魔术棒工具自动定位。
UI设计有顶层容器和中间容器之分,根布局对应于顶层容器。容器控件与普通控件一样,有layout_width、layout_height和id等属性。
Android 系统中的所有 UI 类都是建立在 View 和 ViewGroup 两个类的基础之上的,所有 View 的子类称为 Widget,所有 ViewGroup 的子类称为 Layout。其中 ViewGroup 是 View 的子类。
View 是所有 UI 组件的基类,基本上所有的高级 UI 组件都是继承 View 类实现的,如 TextView(文本框)、Button、List、EditText(编辑框)、Checkbox 等。一个 View 在屏幕占据一块矩形区域,负责渲染这块矩形区域,也可以处理这块矩形区域发生的事件,并可以设置该区域是否可见以及获取焦点等。
ViewGroup 是容纳这些组件的容器,其本身也是从 View 中派生出来的,它继承于 Android.view.View,功能就是装载和管理下一层的 View 对象或 ViewGroup 对象,也就是说它是一个容纳其他元素的容器,负责对添加进来的 View 和 ViewGroup 进行管理和布局。

2.2布局
有关用户界面的布局有下面常见的七种布局。线性布局(LinearLayout),帧布局(FrameLayout),表格布局(TableLayout),相对布局(RelativeLayout),绝对布局(AbsolateLayout),网格布局(GridLayout),约束布局(ConstraintLayout)。而相对布局已使用约束布局替代,绝对布局难以实现多分辨率适配,不建议使用。主要介绍线性布局、帧布局。
线性布局(LinearLayout):LinearLayout是最常用的布局方式,有垂直和水平布局方式,垂直线性布局,每个控件占一行;水平线性布局,控件自左向右排列,控件太多时也不会转行。线性布局使用成对的标签,必须指定分别表示容器宽度和高度的两个属性android:layout_width和android:layout_height,它们的取值为match_parent(匹配父容器)、wrap_content(自适应控件大小)或具体值(以dp为单位)。线性布局可选属性主要是android:orientation,当取值为vertical时称为垂直线性布局,当取值为horizontal时称为水平线性布局,且以vertical为默认值。线性布局可以嵌套。例如,在垂直线性布局里嵌套一个水平线性布局时,就可以在一行内水平放置多个控件。
帧布局(FrameLayout):将组件放置在左上角位置,当添加多个组件时后面的组件将遮盖前面的组件。帧布局会按照添加顺序层叠在一起,默认层叠在左上角位置。可以使用属性"layout_gravity"可以设置层叠的位置,值得注意的是这个属性是相对父控件来说的,也就是说一个按钮相对其父物体来说的位置。

2.3基础控件
常见的基础控件有:TextView、EditText、ImageView、Button、CheckBox、ListView。
TextView是文本类控件,用来显示字符的控件。
EditText是文本类控件,用来输入和编辑字符的控件。
ImageView是图像控件,用来显示图像,在布局文件中,使用属性android:src指定图像的来源。在程序里,使用方法setImageResource(resId)指定图像的来源。
Button:表示按钮,它继承自TextView控件,既可以显示文本,又可以显示图片,同时也允许用户通过点击来执行操作,当Button控件被点击时,被按下与弹起的背景会有一个动态的切换效果,这个效果就是点击效果 。单击事件监听器有多种使用方式,当Activity组件只有一个Button按钮时,一般是在setOnClickListener()方法里,创建一个匿名内部类对象。
CheckBox:表示复选框,是Button的子类,用于实现多选功能,通过android:checked属性指定CheckBox控件是否选中的状态。
ListView:是一种用于垂直显示的列表控件,如果显示内容过多,则会出现垂直滚动条;能够通过适配器将数据和自身绑定,在有限的屏幕上提供大量内容供用户选择;支持点击事件处理,用户可以用少量的代码实现复杂的选择功能。

2.4 adapter
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。Android使用Adapter(适配器)作为数据和列表之间的桥梁和纽带。
Adapter常用类:
ArrayAdapter:通常用于将数组或List集合的多个值包装成多个列表项。
SimpleAdapter: 将List集合的多个值包装成多个列表项。
BaseAdapter:是一个抽象类,通常用于扩展,具有较高的灵活性。

ArrayAdapter参数:
ArrayAdapter(Context context, int resource, int textViewResourceId, List objects)
Context:代表了访问整个Android应用的接口,必须指定(this)
resource或textViewResourceId:资源ID,每个列表项的组件(显示)
数组或List:负责提供多个列表项(提供数据)