Android应用开发教程(第2版)
上QQ阅读APP看书,第一时间看更新

3.2 Android基本组件

07 界面设计

Android应用程序的人机交互界面由很多的Android组件组成,如之前多次使用的TextView、Button等都是Android提供的组件。

本节准备开发一个小型的计算器,用于计算输入的两个数的和差积商,第一行用于输入第一个数,第二行用于选择四种运算之一,第三行用于输入第二个数,第四行是一个按钮,当单击该按钮后,将运算结果显示到第五行。

3.2.1 文本显示组件

文本显示(TextView)组件主要用于显示静态文本,类似于Java中的Label标签控件,所不同的是,Android中的TextView组件可以显示单行文本,也可以显示多行文本,还可以显示带图像的文本。

AS支持可视化和XML编辑方式添加TextView组件,在布局中添加一个TextView组件,其常见属性可以在右侧的属性栏中设定,如图3-11所示。

图3-11 TextView组件属性

除了以可视化方法修改属性之外,还可以直接切换到XML源代码查看。TextView的配置代码如下所示。

TextView常用属性如表3-9所示。

表3-9 TextView常用属性

(续)

说明:layout_width和layout_height是相对上级元素而确定的布局方式,所以可以设定三个特殊的值,其含义如下。

➢ fill_parent:强制性地使组件扩展,以填充布局单元内尽可能多的空间。设置一个顶部布局或组件为fill_parent将强制性地让它布满整个屏幕。

➢ wrap_content:设强制性地使视图扩展以显示全部内容,布局元素将根据内容更改大小。

➢ match_parent:Android 2.2中match_parent和fill_parent两个参数的含义一样,match_parent更贴切,于是从Android 2.2开始两者都可以用。如果考虑兼容低版本的使用情况就需要用fill_parent。

大多数程序员更喜欢使用layout_width和layout_height来取代width和height。

Android除了通过XML文件静态增加TextView之外,还可以使用Java代码动态产生文本框组件。组件对象创建成功后,可以使用set****()方法设置组件的各种属性,使用setContentView()方法显示内容。以下代码演示了动态构建一个TextView对象并设置其中显示的文本,最后显示出来的处理过程,Java代码如下。

对于使用XML静态布局方式添加的TextView组件,如果需要动态更改显示内容,程序可以利用findViewById(id)函数来访问该元素。findViewById(id)函数从Android 1.0就存在了,是个元老级别的函数,也是非常重要的函数,其功能就是根据提供的组件id获得组件对象。该函数的返回值是View类型的,所以一般情况下需要进行类型转换。

不仅对于TextView组件如此,其他的组件对象也基本是通过该方法来进行访问,如果布局文件中设置TextView的id为textView1,那么可以通过下列代码将组件上的文字修改为“Hello”。

通常情况下,前两句可以合并为一行,如下所示。

3.2.2 编辑框组件

AS中的编辑框(EditText)组件用于输入信息,可以输入单行文本或多行文本,还可以输入指定格式的文本(如密码、电话号码、E-mail地址等)。其继承自TextView,所以其大部分属性与TextView类似。EditText的特色属性如表3-10所示。

表3-10 EditText的特色属性

同TextView类似,AS中可通过可视化界面迅速添加EditText组件。不过,Palette视图中的Text类别中提供了不同输入功能要求的EditText组件,可以选择某种样式以满足当前的需要,如图3-12所示。

例如拖入一个标志着数字的组件,其自动生成的XML代码如下。

可以通过可视化界面或XML代码方式添加更多的属性,其中<requestFocus />表示该组件可以接受焦点。一般会增加text属性显示默认值(可以是空字符串),增加hint属性显示提示信息等,定义代码如下。

hint属性显示效果如图3-13所示。

对于添加的每一种EditText组件,都可以通过修改android:inputType属性将其转变为其他类型的输入框组件。

也可以使用Java代码动态处理EditText组件,可以创建、更改输入的文字等。这里需要特别说明的是,通过getText()方法取得的编辑框中的值都是字符串类型的,即便其中输入的是形如“123”之类的数字,其返回的仍然是“123”字符串。所以如果需要输入数字,就需要做相应的类型转换。

字符串转换成数值有很多办法,现在可以先掌握一种:Integer.parseInt(str),其中str为字符串。一般情况下,首先从组件中接收用户输入信息,然后利用这个方法进行转换,参考代码如下。

图3-12 Text类别中的EditText组件

图3-13 hint属性显示效果

3.2.3 按钮组件

按钮(Button)组件是Android中应用最多的组件之一。与其他组件一样,Button有两种添加方式,第一种是在XML中通过<button></button>标记添加,第二种是在程序中直接使用Button类创建对象并添加到视图中。推荐使用第一种。

在XML中配置Button时,AS同样支持可视化和代码方式。在AS中进行可视化配置时,只须在组件视图的Buttons类中选择合适的Button拖动到布局中即可。选择添加的Button,同样可以在属性视图中配置各种属性,也可在XML代码视图中直接修改各种属性。例如以下的Button示例:

Button组件一般用作发布命令,发布单击命令后执行对应的程序,这个程序一般被称之为“单击事件响应程序”。在Android中,一般首先为按钮注册单击监听事件,监视是否有单击事件发生于该按钮上,如果有,则去执行对应的单击事件响应程序。

为按钮绑定监听程序有两种方法,一种是在Activity的onCreate()方法中完成,示例代码如下。

另一种方法是在Activity中编写一个包含View类型参数并且将要触发的处理代码放在其中,然后在布局文件中给Button添加android:onClick属性指定对应的方法名。例如在Activity中编写一个方法如下。

然后在布局文件中,给Button添加属性android:onClick="myClick"实现给按钮添加监听器。

3.2.4 单选按钮/单选按钮组组件

默认情况下,单选按钮(RadioButton)组件一般呈现为一个圆形图标,旁边放置一些说明性文字。使用时,将多个单选按钮放在一组中,它们一起被称为单选按钮组(RadioGroup)组件。对于单选按钮,其状态可以是“选中”或“未选中”。初始时通过checked属性可以设置单选按钮的状态。同一组中的单选按钮具备排他性,组中某个单选按钮被选中,组中其他单选按钮就会被取消选择。

单选按钮继承自Button类,所以单选按钮可以支持Button的所有属性。同其他组件类似,在Android中有两种方式添加单选按钮组件,一种是在XML布局文件中通过<RadioButton>标记添加,另一种是在Java代码中通过创建RadioButton类对象添加。推荐使用XML布局文件配置方式。

在AS中,XML布局文件配置方式依然支持可视化和代码操作方式,具体操作模式与其他组件类似,最后可得到如下所示的XML代码。

通常情况下,单选按钮一般放在RadioGroup组件中,在XML文件中添加RadioGroup的示例代码如下。

RadioGroup组件有一个特别的属性orientation,通过将该属性设定为horizental或vertical可以确定该组中的各单选按钮的排列方式为水平还是垂直。

对于用户选中情况的判定,同按钮按下与否的判定类似,同样通过监听实现。对于单选按钮组而言,需要监听的是“选中的单选项目是否发生变化”这个事件,即setOnCheckedChange Listener()。在onCreate()方法中添加如下代码。

3.2.5 复选框组件

默认情况下,复选框(CheckBox)组件显示一个方块图标,在该图标旁边放置一些说明性文字。复选框的使用与单选按钮类似,所不同的是,单选按钮存在分组的情况,而复选框是独立操作的,可以多选。

在AS中,仍然提供两种方式添加复选框组件,一种是在XML布局文件中通过<CheckBox>标记添加,另一种是使用Java代码通过创建CheckBox类对象添加。推荐XML布局文件方式,在XML布局文件中添加CheckBox的示例代码如下。

复选框通过Checked属性确定是否被选中,该类有两个常用的方法。

➢ isChecked():获知当前状态,该方法返回true表示当前复选框为选中状态,否则为未选中。

➢ setChecked():通过参数true或false设置复选框为选中或未选中状态。

由于复选框可以多选,因此为了确定用户是否选择了某一项,需要为每个选项都添加事件监听器。例如为checkBox1添加如下事件监听器代码。

3.2.6 图像视图组件

图像视图(ImageView)组件用于在界面中显示任何的Drawable对象,通常用来显示图片。在Android中,有两种方法添加图像视图,第一种是通过在XML布局文件中使用<ImageView>标记添加,第二种是在Java代码中通过创建ImageView类对象添加。推荐采用第一种方法添加。

使用ImageView组件显示图片时,通常可以将要显示的图片放置在res\drawable目录中,然后应用类似下面的代码将图像显示在布局管理器中(通过android:src属性设置图片)。

ImageView组件常用XML属性如表3-11所示。

表3-11 ImageView组件常用XML属性

其中android:scaleType属性设置填充方式,其可选值说明如表3-12所示。

表3-12 android:scaleType属性的可选值

3.2.7 滚动视图组件

滚动视图(ScrollView)组件用于为其他组件添加滚动条。在默认的情况下,由于Android的布局管理器没有提供滚动屏幕的功能,当窗体中的内容较多而一屏显示不下时,超出的部分用户将看不到,这时就需要使用ScrollView组件了。

在滚动视图中可以放入任何类型的组件,但是只能放一个,如果需要放置多个组件,可以先在滚动视图中放置一个布局管理器,再在布局管理器中放置其他的组件。ScrollView组件只支持垂直滚动,如果要实现水平滚动,需要使用水平滚动视图(HorizontalScrollView)。

同其他组件类似,Android中可以使用XML布局文件和Java代码创建对象两种方法添加滚动视图。推荐使用XML布局文件方法,示例XML代码如下。

3.2.8 日期/时间选择器组件

为了让用户获取日期和时间,Android提供了日期/时间选择器(DatePicker/TimePicker)组件。用户可以在XML布局文件中直接添加这两个组件到界面中。AS同样提供了XML布局文件和Java代码创建对象两种方法添加日期/时间选择器,XML代码示例如下。

为了在程序中获取用户选择的日期和时间,还需要为组件添加事件监听器。其中DataPicker组件对应的事件监听器是OnDateChangedListener,TimePicker组件对应的事件监听器是OnTimeChangedListener。具体使用与其他组件类似,这里不再赘述。

3.2.9 列表选择框组件

列表选择框(Spinner)组件相当于Java中的下拉列表框,用于提供一系列可选择的列表项供用户选择,从而方便用户。

Android中依然可以采用XML布局文件和Java代码创建对象两种方法添加这个组件,推荐使用XML布局方式。Spinner通过修改spinnerMode属性提供下拉或弹出对话框的选择形式,备选内容可以通过entries属性引用定义的数组资源,示例如下。

3.2.10 列表视图组件

列表视图(ListView)组件以垂直的形式列出需要显示的列表项,例如显示系统设置项或功能列表等。要在程序中使用列表视图组件除了上述采用XML布局文件和Java代码创建对象两种方法外,还可以通过继承ListActivity类来实现。列表视图支持的XML属性如表3-13所示。

表3-13 列表视图支持的XML属性

(续)

在XML布局中直接添加列表视图的示例代码如下。

3.2.11 实例2:简易计算器

1.新建项目,增添组件

在AS中新建项目,应用程序命名为“简易计算器”,项目命名为“ch03_02”,其他项取默认值。

为了实现数据的输入,需要使用EditText组件用于输入信息;RadioGroup和RadioButton组件用于4种运算方法的选择;Button组件用于确定运算;TextView组件用于显示结果。各组件及其功能见表3-14。

表3-14 各组件及其功能

为了取得用于选择的运算符,需要对单选按钮进行监听,即需要重写调用单选按钮的setOnCheckedChangeListener方法。

onCheckedChanged()方法有两个参数,第一个参数是对于单选按钮组的引用,第二个参数则是当前选中单选按钮的id。在onCheckedChanged()中获取用户当前所选运算符。一般可以在类MainActivity中增加一个记录当前运算符的字符串opr,其值与单选按钮默认选中的“+”保持一致,以后只要单选按钮组发生变化,opr同步进行变化。

然后为按钮增加单击响应事件。

2.设计布局

考虑到上述组件由上到下依次排列,所以首选线性布局方式,在其中添加相应组件。为了不造成混淆,字符串没有专门定义字符串资源,在真正进行项目实施的时候,需要注意选择字符串等相关资源。

布局文件activity.xml的内容如下。

3.参考代码

这里需要提醒的是,在比较字符串是否相同时,不能直接使用“==”,而应该调用字符串对象的equals()方法。运行程序,选择不同运算符,加法结果如图3-14所示。

图3-14 加法结果

注意:做除法运算时,如25/3=8,会有些误差。这是程序中的商仅用整数来记录导致的。另外,程序并没有对除数为0、缺失操作数等例外情况进行处理,读者可以自行修改、调整程序以完成这些功能,否则非法操作就可能导致程序崩溃。