- Android和PHP开发最佳实践(第2版)
- 黄隽实
- 817字
- 2024-12-21 03:04:40
2.7 Android应用界面
Android应用界面系统,即Android UI(User Interface)系统是Android应用框架最核心的内容之一,也是开发者们需要重点掌握的内容。如果我们把Android应用也分为前后端两部分的话,那么之前介绍的核心要点和四大组件等都属于后端,而Android UI系统则属于前端。后端保证应用的稳定运行,而前端则决定应用的外观和体验。对于一个优秀的Android应用来说,漂亮的外观和流畅的体验是必不可少的。接下来,我们便来学习Android外观系统的知识。
在2.3.3节中我们已经简单介绍了Android应用框架中的外观系统(View System),也就是Android UI系统的基础知识。我们知道了对于Android应用来说,最重要的两个基础类就是View和ViewGroup:View是绝大部分UI组件的基础类,而ViewGroup则是所有Layout布局组件的基类。当然,ViewGroup也是View的子类。相关类库的树形结构如下。
java.lang.Object |- android.view.View |- android.view.ViewGroup |- android.widget.FrameLayout |- android.widget.LinearLayout |- android.widget.TableLayout |- android.widget.RelativeLayout |- android.widget.AbsoluteLayout
本节将重点介绍Android应用(非游戏)使用的UI系统。一般来说,我们都使用XML格式的模板文件来书写对应的UI界面,当然,这种做法也比较符合MVC的设计思想。另外,由于UI模板独立于逻辑之外,界面设计师们就可以更加专注于他们自己的事情。在模板文件中,每个UI控件都由对应的XML标签来表示,具体的控件标签见表2-3,大家可以回顾一下。
2.7.1 控件属性
我们知道Android UI系统给我们提供了丰富多彩的控件,比如TextView、Button、TextView、EditText、ListView、CheckBox、RadioButton等,具体如表2-3所示。我们可以使用这些不同功能的控件来完成各种各样用户界面的需求。那么控件本身的属性应该如何设置呢?实际上,每个UI控件都有很多的属性可供我们选择,我们一般都是通过设置这些属性来设置UI控件的外观、位置等。代码清单2-17中就是使用XML来表示文本框控件(TextView)的示例,实际的显示效果是在整个UI界面的左上方打印一段文字“I am a TextView”。
代码清单 2-17
<TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="I am a TextView" />
Android UI控件使用android:layout_width和android:layout_height属性控制其宽度和高度,属性值为wrap_content表示元素的外观由内容大小决定,而fill_parent则表示元素大小由外层的元素决定。我们经常使用fill_parent来实现自适应的界面布局,因为最外层的元素必然就是手机屏幕。此外我们需要注意的是,这两个属性是每个UI控件必须指定的。
另外,Android UI控件的外观采用类似于CSS标准的“盒子模型”,也有margin和padding的概念,元素内边距使用android:padding来表示,外边距则采用android:layout_margin来控制。这两个属性也是我们最常使用的“利器”之一,用其可使整个界面各个控件之间的间隔更为合理、美观。Android UI控件“盒子模型”如图2-7所示,大家可以结合示意图理解一下。
图2-7 盒子模型
最后,我们来学习一些基础的Android UI控件属性,这些属性在UI组件基础类View类中定义,具备很强的通用性,可被绝大部分的UI控件所使用,因此也被称作“通用属性”。对于我们来说,只有掌握了这些通用属性的用法,才能够更好地控制UI组件并运用它们组装出各种各样的UI界面。
·android:id:每个UI控件的代表性id。我们经常在程序中使用findViewById方法来选取对应id的控件,然后再对该控件进行属性控制或者事件处理,用法和HTML元素标签属性中的id类似。
·android:background:控件背景,可以是颜色值,也可以是图像或者Drawable资源等,如果值为@null,则表示透明背景。
·android:layout_width:UI控件的宽度,常见属性有fill_parent、wrap_parent等。前面我们已经简单介绍过这个属性的用法,它是每个控件必须具备的属性之一。
·android:layout_height:UI控件的高度,常见属性和用法和宽度一样,也是每个控件必须具备的属性之一。
·android:layout_gravity:用于控制UI控件相对于其外层控件的位置,其属性值就代表其位置,如顶部(top)、底部(bottom)、左边(left)、右侧(right)、垂直居中(center_vertical)、水平居中(center_horizontal)、绝对居中(center)、垂直填满(fill_vertical)、水平填满(fill_horizontal)、完全填满(fill)等。另外,这些属性可以并列存在,我们常使用“|”符号隔开,如“center_vertical|center_horizontal”表示垂直水平居中。
·android:layout_margin:UI控件的外边距,使用方式见图2-7所示的“盒子模型”。
·android:padding:UI控件的内边距,使用方式见图2-7所示的“盒子模型”。
·android:gravity:控件内部的元素相对于控件本身的位置,其属性值和使用方法与android:layout_gravity基本一致。
·android:visibility:显示或隐藏控件,控件默认是显示状态的。
通用属性常用于操控UI控件的外观和位置,通常能对UI界面的构建起到很大的作用。当然,除了通用属性之外,不同的UI控件还会有各自专属的“控件属性”,这些属性我们将在后面讲到各种UI控件的概念和用法时详细介绍,具体内容可参考第7章中与界面控件相关的章节内容。
2.7.2 布局(Layout)
Android UI系统中的布局文件其实和HTML有点类似,都是用XML标签所代表的各种UI控件组合或者嵌套而成的,只不过,Android模板文件的格式比HTML更严谨些,属性也更复杂些。在Android UI界面设计中,Layout布局控件就像“建筑师”一样,帮助我们把整个界面的框架布局搭建起来,并把每个控件都放到合适的位置上。我们最经常使用的布局有以下几种,我们来逐个介绍一下。
1.基本布局(FrameLayout)
基本布局(FrameLayout)是所有Android布局中最基本的,此布局实际上只能算是一个“容器”,里面所有的元素都不能被指定位置,默认会被堆放到此布局的左上角。此布局在普通的应用中用得不是很多,但是因为简单高效,所以在一些游戏应用中还是经常被用到。
2.线性布局(LinearLayout)
线性布局(LinearLayout)是应用开发中最常用的布局之一,分为横向和纵向两种,由android:orientation属性来控制。当属性值为“horizontal”时表示横向的线性布局,常用于并排元素的界面;而“vertical”则表示纵向也就是垂直的线性布局,它的用处更广,普通应用中的大部分界面都是垂直排列的,比如列表界面、配置界面等。
线性布局的用法很简单,就拿垂直的线性布局来说,我们只要把所需的控件按照顺序放到布局标签中间就可以了,Android UI系统会自动按照从上到下的顺序展示出来。代码清单2-18就是一个简单的代码示例,其功能很简单,就是把一个TextView和Button垂直并排在这个线性布局中。大家在阅读示例代码的同时可以顺便复习一下UI控件属性的用法。
代码清单 2-18
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="I am a TextView" /> <Button android:id="@+id/button_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="I am a Button" /> </LinearLayout>
3.相对布局(RelativeLayout)
相对布局(RelativeLayout)也是最常使用的布局之一,由于其内部的所有元素都是按照相对位置来排列的,所以不需要嵌套其他的布局,它可以使UI模板布局更加地简洁和高效。该布局中的控件元素都是以“参照控件”为准来排布的,比如控件属性设置为“android:layout_toRightOf="@+id/referBox"”,则表示该控件位于id为referBox的参照控件的右边。以下是相对布局中其他常用属性的列表,供大家参考。
·android:layout_toLeftOf:该控件位于参照控件的左方。
·android:layout_toRightOf:该控件位于参照控件的右方。
·android:layout_above:该控件位于参照控件的上方。
·android:layout_below:该控件位于参照控件的下方。
·android:layout_alignParentLeft:该控件是否与父组件的左端对齐。
·android:layout_alignParentRight:该控件是否与父组件的右端对齐。
·android:layout_alignParentTop:该控件是否与父组件的顶部对齐。
·android:layout_alignParentBottom:该控件是否与父组件的底部对齐。
·android:layout_centerInParent:该控件是否与父组件居中对齐。
·android:layout_centerHorizontal:该控件是否与父组件横向居中对齐。
·android:layout_centerVertical:该控件是否与父组件垂直居中对齐。
4.绝对布局(AbsoluteLayout)
绝对布局(AbsoluteLayout)的用法类似于HTML中的层属性“position=absolute”,该布局内部的控件可以使用android:layout_x和android:layout_y两个属性来指定它相对于布局坐标轴原点的X轴和Y轴方向的距离。图2-8就是绝对布局的示意图。
图2-8 绝对布局的示意图
5.表格布局(TableLayout)
大家如果熟悉HTML的话,应该非常熟悉表格布局(TableLayout),像一些表格型的信息列表都是使用表格布局来展示的。表格型布局的标签有两个——<TableLayout/>和<TableRow/>,前者是表格布局的主要标签,整个表格布局的框架,类似于HTML标签中的<table/>;后者是表格行,类似于HTML标签中的<th/>或者<tr/>。表格布局的使用范例如代码清单2-19所示。
代码清单 2-19
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="0,1,2"> <TableRow> <TextView android:gravity="center" android:text="ID"/> <TextView android:gravity="center" android:text="NAME"/> </TableRow> <TableRow> <TextView android:gravity="center" android:text="1"/> <TextView android:gravity="center" android:text="james"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="Edit"/> </TableRow> <TableRow> <TextView android:gravity="center" android:text="2"/> <TextView android:gravity="center" android:text="iris"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="Edit"/> </TableRow> </TableLayout>
上述XML模板的最终显示结果如图2-9所示,我们可以看到,这是一个3行3列的标准表格结构,对应到代码中就是3个<TableRow/>标签,每个标签中包含3个控件。
图2-9 表格布局示例
另外,我们还要注意的是,<TableLayout/>有3个很重要的属性:android:stretchColumns、android:shrinkColumns和android:collapseColumns,分别对应的是拉伸、收缩和隐藏列行为,如代码清单2-19中我们使用“android:stretchColumns="0,1,2"”,就表示所有列都是拉伸状态,因此每列中的控件才会平分并填满整行的空间;假如我们设置“android:collapseColumns="2"”,那么最右边的列将会被隐藏。
6.标签布局(TabLayout)
标签布局(TabLayout)在移动应用中是相当流行的,其用法相对比其他布局复杂一些,需要配合程序来实现。接下来我们来看一个简单的标签布局的实例,其模板文件如代码清单2-20所示。
代码清单 2-20
<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost_id" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp"> <TabWidget android:id="@android:id/tabtitle_id" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent_id" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> </TabHost>
此界面最外面是一个<TabHost/>标签,里面嵌套了一个垂直的线性布局,该线形布局里面又包含了一个<TabWidget/>和<FrameLayout/>,这些标签都是需要在程序中设置的。紧接着,在模板对应的Activity类中设置该TabLayout的逻辑,使用范例见代码清单2-21。
代码清单 2-21
public class TabDemo extends TabActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 初始化资源对象 Resources res = getResources(); TabHost tabHost = getTabHost(); TabHost.TabSpec ts; Intent intent; // 设置第1个Tab intent = new Intent().setClass(this, Tab1Activity.class); ts = tabHost .newTabSpec("tab1") .setIndicator("Tab1", res.getDrawable(R.drawable.ic_tab_1)) .setContent(intent); tabHost.addTab(ts); // 设置第2个Tab intent = new Intent().setClass(this, Tab2Activity.class); ts = tabHost .newTabSpec("tab2") .setIndicator("Tab2", res.getDrawable(R.drawable.ic_tab_2)) .setContent(intent); tabHost.addTab(ts); // 设置第3个Tab intent = new Intent().setClass(this, Tab3Activity.class); ts = tabHost .newTabSpec("tab3") .setIndicator("Tab3", res.getDrawable(R.drawable.ic_tab_3)) .setContent(intent); tabHost.addTab(ts); // 设置默认选中Tab tabHost.setCurrentTab(0); } ... }
我们从代码注释中可以清楚地看到,在该实例中我们添加了3个Tab标签,程序使用newTabSpec方法获取TabHost.TabSpec对象,然后使用setIndicator和setContent方法设置Tab的顶部样式和内部信息,最后再调用setCurrentTab方法设置默认选中的标签页。最后,分别实现Tab1Activity、Tab2Activity和Tab3Activity界面类的逻辑,并加入声明到Manifest应用的配置文件中。至此,整个标签布局的设置就完成了。
2.7.3 事件(Event)
了解完UI控件和界面布局的基本知识之后,我们还需要知道如何控制这些界面上的控件元素。Android应用框架为我们提供了事件机制来处理用户触发的动作,常见的事件包括键盘事件KeyEvent、输入事件InputEvent、触屏事件MotionEvent等。在实际应用中,我们需要掌握如何响应当用户操作这些控件时所触发的事件。比如,用户点击某个按钮控件(Button)之后需要执行一些程序逻辑,此时我们需要使用Android系统给我们提供的事件监听器Listener来捕获按钮的点击事件来执行这些逻辑。本节中我们将会介绍Android应用框架中比较常见的监听器。
1.View.OnClickListener事件
View.OnClickListener是最经常使用的监听器之一,用于处理点击事件。其实,该类也是View基类中的公用接口,其接口方法为onClick(View v)。方法只有一个参数,就是点击事件触发的控件对象的本身。我们在使用过程中必须实现onClick方法,也就是把点击之后需要处理的逻辑代码放到此方法中。代码清单2-22就是相关的使用范例。
代码清单 2-22
btnObj = (Button) this.findViewById(R.id.demo_btn_id);
btnObj.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 按钮点击之后的动作
...
}
});
上面的代码实现的就是id为demo_btn_id的按钮控件的点击事件,我们在使用findViewById获取到按钮实例对象之后,又通过setOnClickListener方法设置View.OnClickListener监听器对象的实现,点击事件需要处理的逻辑我们会在onClick方法中实现。大家可以看到,Android UI事件的概念和用法与JavaScript语言有点类似。
2.View.OnFocusChangeListener事件
监听器View.OnFocusChangeListener用于处理选中事件,比如界面中有若干个UI控件,当需要根据选中不同的控件来处理不同的逻辑时,就可以使用按钮控件对象的setOnFocusChangeListener方法来设置View.OnClickListener监听器对象。选中需要处理的逻辑会在该监听器对象的onFocusChange方法中实现。
onFocusChange方法有两个参数:第一个是事件触发的控件对象,我们可以用其判断并处理不同控件的触发事件,另一个则是布尔型的值,表示该控件对象的最新状态。另外,监听器的具体用法和View.OnClickListener类似。
3.View.OnKeyListener事件
监听器View.OnKeyListener用于处理键盘的按键。我们可以在该监听器的onKey方法中处理用户点击不同按键时所需要处理的逻辑。在Android的键盘系统中,每个按键都有自己的代码,也就是keyCode。需要注意的是,onKey方法的第二个参数传递的就是用户点击按键的keyCode,而后我们就可以使用switch语句来处理不同的按键事件了。这个思路其实和JavaScript中的onkey系列方法非常类似,读者如果熟悉JavaScript的话,可以对照着学习一下。
4.View.OnTouchListener事件
监听器View.OnTouchListener用于处理Android系统的触屏事件。如果我们需要对一些触摸动作做处理,或者需要处理比点击动作此类动作更细粒度的动作的话,就要用到这个监听器了。此监听器必须实现的接口方法是onTouch(View v,MotionEvent event),我们需要注意的是第二个参数,因为这个参数表示的是用户触发的动作事件,我们可以根据这个参数的值来处理比较复杂的手势(gesture)动作。
MotionEvent事件中比较常见的动作和手势常量的说明如下,供大家参考。
·ACTION_DOWN:按下手势,包含用户按下时的位置信息。
·ACTION_UP:松开手势,包含用户离开时的位置信息。
·ACTION_MOVE:拖动手势,包含最新的移动位置。
·ACTION_CANCEL:结束手势,类似于ACTION_UP,但是不包含任何位置信息。
·ACTION_OUTSIDE:离开控件元素时所触发的事件,只包含初始的位置信息。
·EDGE_BOTTOM:碰触屏幕底部时所触发的事件。
·EDGE_LEFT:碰触屏幕左边时所触发的事件。
·EDGE_RIGHT:碰触屏幕右边时所触发的事件。
·EDGE_TOP:碰触屏幕顶部时所触发的事件。
·ACTION_MASK:多点触碰事件的标志,可用于处理多点触摸事件。
·ACTION_POINTER_DOWN:第二点按下时的触发事件。
·ACTION_POINTER_UP:第二点松开时的触发事件。
可以想象,如果缺少事件响应的支持,Android应用的界面将会变得毫无交互性。因此,学会使用UI控件的各种响应事件的用法对于Android应用开发来说是非常重要的。通常情况下,我们会使用不同的事件来让界面中的元素生动起来。比如,我们可以通过实现某个UI控件的View.OnClickListener事件来响应用户的点击动作(如代码清单2-22所示),或者还可以使用View.OnTouchListener事件来响应一些更加复杂的动作。
2.7.4 菜单(Menu)
菜单是Android应用系统中最有特色的功能之一,也是每个Android应用必不可少的组件之一。合理地使用菜单不仅可以帮助我们节省界面空间,还可以提升用户的操作体验。一般,我们最常用的菜单有以下3种,下面我们分别来学习一下。
1.选项菜单(Options Menu)
选项菜单(Options Menu)是Android应用中最经常被使用的菜单,当用户按下系统菜单键时出现。在Activity中,我们通常使用onCreateOptionsMenu方法来初始化菜单项,然后再使用onOptionsItemSelected方法处理每个菜单项选中时的逻辑。使用范例如代码清单2-23所示。
代码清单 2-23
public class MenuActivity extends Activity { ... @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); // 添加书写按钮菜单项 menu.add(0, MENU_APP_WRITE, 0, R.string.menu_app_write).setIcon(...); // 添加注销按钮菜单项 menu.add(0, MENU_APP_LOGOUT, 0, R.string.menu_app_logout).setIcon(...); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_APP_WRITE: // 点击书写菜单项之后的逻辑 ... break; case MENU_APP_LOGOUT: // 点击注销菜单项之后的逻辑 ... break; } return super.onOptionsItemSelected(item); } }
当然,如果我们需要添加一些每次菜单加载时都需要执行的逻辑,则需要使用onPrepareOptionsMenu方法来处理,因为onCreateOptionsMenu只在菜单项初始化的时候执行一次。
2.上下文菜单(Context Menu)
上下文菜单(Context Menu)的概念和PC上应用软件的快捷菜单有点类似,在UI控件注册了此菜单对象以后,长按视图控件(2秒以上)就可以唤醒上下文菜单。在Activity类中,我们可以使用onCreateContextMenu方法来初始化上下文菜单。和选项菜单略微不同的是,此方法在每次菜单展示的时候都会被调用。另外,处理上下文菜单点击事件的方法名为onContextItemSelected,其用法和前面介绍的选项菜单中的onOptionsItemSelected方法类似。
3.子菜单(Submenu)
在Android应用中点击子菜单时会弹出悬浮窗口显示子菜单项,子菜单(Submenu)可以被添加到其他的菜单中去。使用方法也很简单,Submenu的使用范例如代码清单2-24所示。我们需要注意的是,子菜单是不可以嵌套的,即子菜单中不能再包含其他子菜单,我们在使用的时候必须注意这个问题。
代码清单 2-24
publicboolean onCreateOptionsMenu(Menu menu) { // 初始化变量 int base = Menu.FIRST; // 添加子菜单 SubMenu subMenu = menu.addSubMenu(base, base+1, Menu.NONE, "子菜单-1"); // 设置图标 subMenu.setIcon(R.drawable.settings); // 添加子菜单项 subMenu.add(base, base+1, base+1, "子菜单项-1"); subMenu.add(base, base+2, base+2, "子菜单项-2"); subMenu.add(base, base+3, base+3, "子菜单项-3"); return true; }
以上我们介绍了Android系统中最常见的几种菜单的概念和基本用法,关于菜单组件实际运用的更多信息,我们将在实战篇的7.5.1节中结合实际案例做进一步的介绍。
2.7.5 主题(Theme)
为了让Android UI界面开发更加快速方便,同时具有更好的复用性,应用框架为我们提供了样式(style)和主题(theme)两个功能。这两个功能让我们可以更好地控制UI界面的外观,并可以实现一些更高级的功能,比如换肤功能等。
首先,需要了解的是,我们通常会把样式和主题的声明放在Android应用框架的资源目录res/values/下的styles.xml文件中,使用范例如代码清单2-25所示。
代码清单 2-25
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CommonText" parent="@style/Text"> <item name="android:textSize">12px</item> <item name="android:textColor">#008</item> </style> </resources>
我们可以看到,在这个样式文件中我们声明了一个名为“CommonText”的样式,里面包含了该样式的两个属性:字体大小“android:textSize”和字体颜色“android:textColor”属性。另外,样式是支持继承的,比如,该样式就继承自系统的基础“Text”样式,这种使用parent属性设置父样式的用法还是比较容易理解的。了解完样式和主题的写法,接下来让我们认识一下样式和主题之间的区别。
1.样式(style)
Android的UI系统中,样式(style)的概念和CSS中样式的概念非常类似,我们可以把一些常用的样式提取出来,比如代码清单2-20中,我们就把一种常见的文字样式提取出来并保存为“CommonText”的样式。应用样式的时候,我们只需要在对应控件的声明中加上“style="@style/CommonText"”属性值即可。一般来说,样式都只会被应用于单个View控件中。
2.主题(theme)
与样式不同,主题(theme)一般被用于更外层的ViewGroup控件中,比如,我们需要让Activity下所有控件的字体都用CommonText的样式,那么我们就可以在应用配置文件中的<activity/>标签加上“android:theme="CommonText"”的属性。但是,如果我们把样式用在ViewGroup上,对于ViewGroup之下的其他View控件却是没有影响的。另外,Android系统还定义了几个基本的系统主题供我们使用,比如Theme.Light主题就是以亮色背景为基调的主题样式。
学会灵活使用样式和主题来渲染Android应用的UI界面是非常重要的,因为该技术不仅可以让界面设计更加容易,还可以简化模板文件的代码,减少开发成本。因此,在实践的过程中,我们要有意识地去运用这些知识和技巧,逐渐掌握Android UI系统的使用。
2.7.6 对话框(Dialog)
在Android应用界面中,经常需要弹出一些悬浮于底层UI界面之上的操作窗口。当这种窗口显示的时候,底层界面通常会被半透明层所覆盖住,焦点则会被该窗口获得,这种窗口就被称为对话框,或者是Dialog。应用中常用的Dialog有提示对话框(AlertDialog)、进度对话框(ProgressDialog)、日期选择对话框(DatePickerDialog)以及时间选择对话框(TimePickerDialog)等。在本节中,我们将重点介绍其中较常使用的两种Dialog的用法。
1.提示对话框(AlertDialog)
提示对话框(AlertDialog)可以算是Android应用中最经常使用的对话框控件了,其主要用于显示提示信息,当然,可以加上确认和取消(YES和NO)按钮。创建AlertDialog需要使用AlertDialog.Builder子类,代码清单2-26演示了创建AlertDialog对话框的标准过程。
代码清单 2-26
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Are you sure you want to exit?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MyActivity.this.finish(); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show();
在以上代码中,首先使用AlertDialog.Builder(Context)方法来获取Builder对象,然后使用Builder类提供的公用方法来设置AlertDialog的文字和属性,接着使用该类的create方法来创建AlertDialog对象,最后调用show方法展示该对话框。显示效果如图2-10所示。
图2-10 提示对话框示例
2.进度对话框(ProgressDialog)
进度对话框(ProgressDialog)在Android应用开发中也经常会用到,主要用于在耗时操作等待时显示。其用法比较简单,一般情况下,只需要调用ProgressDialog的show方法即可,如代码清单2-27所示。
代码清单 2-27
... ProgressDialog dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true); ...
以上代码创建了一个最基本的进度对话框,显示效果如图2-11所示。
图2-11 进度对话框示例
当然,ProgressDialog类还提供了丰富的对话框属性设置方法,如设置进度条的样式、标题、提示信息,以及是否显示按钮等。更多用法示例可参考后面7.11.3节中的内容。至于其他对话框的用法由于篇幅原因,这里不做详细介绍。