65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Android 中使用警报

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (7投票s)

2010年9月5日

CPOL

3分钟阅读

viewsIcon

104413

downloadIcon

2529

关于在 Android 中使用警报的教程。

引言

安卓引入了一种显示交互式消息的方法,那就是使用Alerts(警报)。Alerts 的作用类似于 J2SE 中的 MessageBoxJOptionPane。它们具有可用于进行决策的按钮。

创建警报

让我们看看这个例子来创建一个警报并显示它

//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();

之前的代码会显示以下警报

alerts1.png

代码看起来可能很繁琐,但它非常简单。首先,我们创建一个 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();

这将显示类似这样的警报

alerts2.png

请注意,我们不必指定任何按钮,因为当用户单击任何项目时,警报将消失。

如果列表项在 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 方法还有其他重载,可以接受 AdapterCursor 作为参数,这些参数保存要显示的项目。

显示多项选择

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日:初始发布
在 Android 中使用警报 - CodeProject - 代码之家
© . All rights reserved.