在“安卓编程学习第八天”中,我们学习了通过编程实现TextView控件和Button控件的添加及响应,通过创建并设置线性布局管理器可以将添加的控件加入到界面布局中,还可以通过编程实现控件属性的设置。
但是通过单一的编程实现UI设置导致代码比较庞大,而通过xml界面布局文件实现UI设置又显得不太灵活。因此,今天我们将学习使用编程和xml界面布局文件混合的方式实现UI设置。要实现的功能是通过按键实现图像的切换,需要的组件包括界面布局、图像视图控件和按键控件。一般来说,把变化小、行为比较固定的组件放在xml界面布局文件中进行管理,而把变化多行为比较复杂的组件用代码来进行管理。因此,通过xml文件实现按键布局,通过编程实现把图像视图控件和按键控件。
1 通过xml文件实现按键布局
1.1xml布局文件的添加
新建一个名为“MixView”的AndroidApplication Project。接下来在“MixView->res->layout”中添加一个名为“activity_main_mixview”的“Android XML File”,把“Root Element”设置为“LinearLayout”。
1.2 界面布局组件ID的设置
在编程中需要通过界面布局组件ID获取该组件,因此,需要在xml布局文件中对其ID进行设置。在<LinearLayout>元素中添加“android:id”属性:
<LinearLayout android:id="@+id/root">
以上代码的含义是将界面布局组件的ID设置成了“root”。
2 通过编程实现图像视图控件的设置
图像视图控件用ImageView类表示。在“MixView->src->com.example.mixview->MainActivity.java”的MainActivity类的定义中,通过new关键字调用ImageView类的构造函数创建图像视图控件。
final ImageView image = new ImageView(this);
3 通过编程实现按键控件的设置
按键控件用Button类来表示。在通过new关键字调用Button类的构造函数创建按键控件。并通过setText()方法和setLayoutParams()方法设置按键显示的内容以及宽度和高度(详见“基于Java语言的安卓编程之八”)。
finalButton button = new Button(this);
button.setText("请点击更换图片");
button.setLayoutParams(newViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT
,ViewGroup.LayoutParams.WRAP_CONTENT)
);
4 将图像视图控件和按键控件加入到界面布局组件中
通过findViewById()方法获取界面布局组件,再调用组件的addView()方法将控件加入到组件中。
LinearLayout main = (LinearLayout)findViewById(R.id.root);
main.addView(image);
main.addView(button);
其中,R.id.root是在xml文件中注册的界面布局组件的ID。需要注意的是,设置控件的属性必须在将控件加入到界面布局之前完成,否则运行时程序报错!
5 图片的导入
可以使用以下两种方法将图片导入到项目中。
5.1 直接拷贝法
将要导入项目的图片进行复制后,在Eclipse界面左侧的“PackageExploer”中选择保存图片的文件夹,之后在右键菜单中选择“Paste”进行拷贝,如图5-1所示。
图5-1 直接将图片拷贝到项目中
5.2 间接拷贝法
将要导入项目的图片进行拷贝后,在“我的电脑”中手动将图片拷贝到项目目录下的文件夹中,之后在Eclipse界面左侧的“PackageExploer”中选择该项目,在右键菜单中选择Refresh即可,如图5-2所示。
5-2 间接将图片拷贝到项目中
6 按键响应的实现
通过按键实现在5中导入图片的切换。因此,首先要对导入图片的ID进行定义。
6.1 要显示图片ID的定义
在MainActivity类的定义中,将图片ID定义为一个int类型的集合。
int[] image_showing = new int[]{
R.drawable.ic_launcher,
R.drawable.avd_manager,
R.drawable.axis_device,
R.drawable.axis_globe,
R.drawable.axis_globe_inverted,
R.drawable.anr
};
其中,ic_launcher、avd_manager等是图片的名称,需要注意的是,图片的名称中只能包含字母、数字和下划线等符号。
接下来定义一个int类型的变量,表示当前要显示的图片的索引。
int currentImg = 0;
6.2 按键响应的实现
使用之前介绍的方法为按键添加点击事件的监控器,并且在处理器方法中添加如下代码:
1 @Override
2 publicvoid onClick(View v)
3 {
4 if( currentImg >=6 )
5 {
6 currentImg = 0;
7 }
8 image.setImageResource(image_showing[currentImg]);
9 currentImg++;
10 }
其中,第4行中的6表示要显示图片的数量,也就是图片的索引值不能超过6;第8行中的image是添加的图像视图控件,setImageResource()方法的主要作用是将指定的图片在图像视图控件中显示出来,image_showing是在6.1中定义的图像ID的数组。
程序运行效果如图6-1所示。
图6-1 MixView程序运行效果
7 小结
今天我们学习了通过xml文件和编程混合的方式设置UI。对于界面布局组件,可以通过xml文件实现,而对于按键和图像视图等控件,可以通过编程直接实现。采用混合方式设置UI,既减少了代码又提高了程序的灵活性。