在 Android 中使用警报
关于在 Android 中使用警报的教程。
引言
安卓引入了一种显示交互式消息的方法,那就是使用Alerts(警报)。Alerts 的作用类似于 J2SE 中的 MessageBox
或 JOptionPane
。它们具有可用于进行决策的按钮。
创建警报
让我们看看这个例子来创建一个警报并显示它
//declared as final to be able to reference it in inner
//class declartations of the handlers
final AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("Alert Dialog");
builder.setMessage("This is the alert's body");
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText("You clicked Ok");
}
});
builder.setNegativeButton("Cancel", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText("You clicked Cancel");
}
});
builder.setNeutralButton("Do something", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText("Neutral Button Clicked");
AlertDialog ad=builder.create();
ad.cancel();
}
});
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(txt.getText()+" the cancel listner invoked");
}
});
builder.show();
之前的代码会显示以下警报
代码看起来可能很繁琐,但它非常简单。首先,我们创建一个 AlertDialog.Builder
的实例。 我们使用 builder 对象来构造 AlertDialog
对象。
我们指定警报的标题和图标,然后指定要在消息正文中显示的文本。
AlertDialog
最多可以显示三个按钮
- Positive button(正面按钮):代表确定按钮。
- Negative button(负面按钮):代表取消按钮。
- Neutral button(中性按钮):代表执行除确定或取消之外的其他功能的按钮。
请注意,使用这三个按钮没有限制。 它们可以执行相同的功能;区别仅在于逻辑含义。但是,这三个按钮都会导致警报对话框消失。
然后,我们指定每个按钮的文本和点击处理程序。 在中性按钮点击处理程序中,我们添加了 AlertDialog ad=builder.create();
和 ad.cancel();
行。 第一行获取对 builder 创建的当前对话框的引用,以提供其他功能,例如调用 cancel()
方法。 cancel 方法会引发 onCancel
回调方法。 我们可以用以下代码替换之前的代码
ad.setMessage(message);
ad.setIcon(icon);
ad.setMessage(message);
ad.setButton(text, listener);
.
.
.
显示自定义视图
警报可以显示复杂的视图,而不是简单的文本消息。 创建一个名为 *alertview.xml* 的 XML 布局文件,如下所示
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/toastView" android:background="#DAAA" >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="Hello alerts"
android:textColor="#000" /> <TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/txtDate"
android:textColor="#000" /> <Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/btnAlert"
android:text="Click" /> </LinearLayout>
要将此视图显示为警报视图,我们这样做
View bodyView=getLayoutInflater().inflate
(R.layout.alertview, (ViewGroup)findViewById(R.id.toastView));
TextView txtDate=(TextView)bodyView.findViewById(R.id.txtDate);
txtDate.setText(Calendar.getInstance().getTime().toLocaleString());
Button btnAlert=(Button)bodyView.findViewById(R.id.btnAlert);
btnAlert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
TextView txtDate=(TextView)bodyView.findViewById(R.id.txtDate);
txtDate.setText(Calendar.getInstance().getTime().toLocaleString());
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(Calendar.getInstance().getTime().toLocaleString());
}
});
builder.setView(bodyView);
.
.
.
这种方法有趣的是,警报是完全互动的。 通过单击按钮,您可以更改警报或活动中任何视图的值。
您还可以通过与上述相同的方式,通过 builder.setCustomTitle(View v)
方法将警报的标题设置为自定义视图。
显示项目警报
警报可以显示一个项目列表,用户可以从中进行选择,如下所示
final String [] items=new String []{"Item 1","Item 2","Item 3","Item 4"};
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("Items alert");
builder.setItems(items, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(items[which]);
}
});
builder.show();
这将显示类似这样的警报
请注意,我们不必指定任何按钮,因为当用户单击任何项目时,警报将消失。
如果列表项在 Adapter
中,我们可以使用 builder.setAdapter(Adapter ad,OnClickListener listner)
方法来实现相同的结果
final String [] items=new String []{"Item 1","Item 2","Item 3","Item 4"};
ArrayAdapter<string> arr=new ArrayAdapter<string>
(this, android.R.layout.select_dialog_item,items);
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("Adapter alert");
builder.setAdapter(arr, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(items[which]);
}
});
或者,如果项目是从数据库中的游标返回的,我们可以使用 builder.setCursor(Cursor cursor, OnClickListener listner, String labelColumn)
。
显示带有选择项的警报
我们可以向警报添加带有选择项的项目,无论它们是单项选择(单选按钮)还是多项选择(复选框)。
显示单项选择
final String [] items=new String []{"Item 1","Item 2","Item 3","Item 4"};
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("List alert");
builder.setSingleChoiceItems(items, 0, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(items[which]);
}
});
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.show();
setSingleChoiceItems
的第二个参数是一个整数,用于指定所选项目的索引。 请注意,我们添加了一个正面按钮,单击该按钮会关闭警报,因为与常规项目列表不同,当选择一个项目时,警报不会消失。
builder.setSingleChoiceItems
方法还有其他重载,可以接受 Adapter
或 Cursor
作为参数,这些参数保存要显示的项目。
显示多项选择
final String [] items=new String []{"Item 1","Item 2","Item 3","Item 4"};
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("List alert");
builder.setMultiChoiceItems(items, null, new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// TODO Auto-generated method stub
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(txt.getText()+" "+items[which]);
}
});
builder.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
});
builder.show();
setMultiChoiceItems
的第二个参数是一个布尔值数组,用于指定设置了哪些项目。
如果您不希望选择任何项目,则将其设置为 null
,否则指定一个与项目长度相同的数组,其中包含指示选择了哪个项目以及未选择哪个项目的布尔值,如下所示
new boolean[] {true,false,...}
这与单项选择的方式相同,只是这里的选择是多项。
查看更多教程:http://android-pro.blogspot.com/。
历史
- 2010年9月6日:初始发布