转载请标明出处: http://blog.csdn.net/airsaid/article/details/51155994
本文出自:周游的博客
Android本身提供了丰富的对话框支持,常见有如下四种常用的对话框:
* AlertDialog:最常用、功能最丰富应用最广的对话框。
* ProgressDialog:进度条对话框,这个对话框只是对进度条的一个包装。
* DatePickerDialog:日期选择对话框,这个Dialog只是对DatePicker的包装。
* TimePickerDialog:时间选择对话框,同上。
其中,ProgressDialog、DatePickerDialog、TimePickerDialog都是继承自AlertDialog。
AlertDialog的功能十分强大,它可以生成各种各样的Dialog,下面具体讲解下使用。
一般我们创建一个AlertDialog需要如下几步:
* 1,创建AlertDialog.Builder对象
* 2,调用AlertDialog.Builder的setTitle()或者setCustomTitle()方法设置标题
* 3,调用AlertDialog.Builder的setIcon()方法设置图标
* 4,调用AlertDialog.Builder的相关设置方法设置对话框内容
* 5,调用AlertDialog.Builder的setPositiveButtom()、setNegativeButtom()或者setNeutralButtom()方法给Dialog添加按钮
* 6,调用AlertDialog.Builder的create()方法创建AlertDialog对象,再调用AlertDialog.Builder的show()方法显示Dialog
6步中,可以根据具体Dialog的样式灵活改变,其中,第4步最为灵活,AlertDialog允许创建各种内容的对话框,归纳起来,有如下几种:
* 1,setMessage():设置对话框的内容为简单文本。
* 2,setItems():设置对话框的内容为简单列表项。
* 3,setSingleChoiceItems():设置对话框的内容为单选列表项。
* 4,setMultiChoiceItems():设置对话框的内容为多选列表项。
* 5,setAdapter():设置对话框的内容为自定义列表项。
* 6,setView():设置对话框的内容为自定义View。
下面通过几个实例在介绍具体的用法。
/** 显示简单对话框 */
private void showDialogForMessage() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("简单的对话框")
.setIcon(R.mipmap.ic_launcher)
.setMessage("对话框内的内容");
setPositiveButtom(builder);
setNegativeButton(builder)
.create()
.show();
}
由于有多个Dialog需要演示,所以把添加Button的方法重新抽取为了一个单独的方法进行复用,下面演示的Dialog都使用到了这两个方法:
/** 添加确定按钮 */
public AlertDialog.Builder setPositiveButtom(AlertDialog.Builder builder) {
return builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "点击了确定按钮", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
/** 设置取消按钮 */
public AlertDialog.Builder setNegativeButton(AlertDialog.Builder builder) {
return builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "点击了取消按钮", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
}
运行结果:
除了上面用上面两个方法添加确定和取消Button外,还可以通过 setNeutralButton() 添加一个装饰性的Button:
/** 显示列表项对话框 */
private void shouDialogForItems() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("简单列表项对话框")
.setIcon(R.mipmap.ic_launcher)
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "选择了:" + items[which], Toast.LENGTH_SHORT).show();
}
});
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
通过上面的代码看到,我们通过setItems()创建了一个简单列表项对话框,参数我们可以传入一个数组、或者一个数组的资源ID,在本文演示中items都是引用自同一个数组:
String[] items = {"Airsaid", "周游", "QQ群:5707887"};
运行结果:
/** 显示单选列表项对话框 */
private void showDialogForSingleChoiceItems() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("单选列表项对话框")
.setIcon(R.mipmap.ic_launcher)
// 第二个参数:默认选中第几项
.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "选择了:" + items[which], Toast.LENGTH_SHORT).show();
}
});
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
其中,setSingleChoiceItems() 的第一个参数,可以传入一个数组也可以传入一个Cursor,还可以传入一个ListAdapter作为参数,如果使用ListAdapter作为参数,
那么则由ListAdapter来提供多个列表项组件。
/** 显示多选列表项对话框 */
private void showDialogForMultiChoiceItems() {
boolean[] booleans = {true, true, false};
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("多选列表项对话框")
.setIcon(R.mipmap.ic_launcher)
// 第二个参数:默认选中哪几项 true:选中 false:不选中
.setMultiChoiceItems(items, booleans, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Toast.makeText(MainActivity.this, "选择了:" + items[which], Toast.LENGTH_SHORT).show();
}
});
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
多选列表项对话框和上面的单选列表项使用起来类似,只不过参数2的默认选中从int改为boolean数组。
/** 显示自定义列表项对话框 */
private void showDialogForAdapter() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("自定义列表项对话框")
.setIcon(R.mipmap.ic_launcher)
.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
items), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "选择了:" + items[which], Toast.LENGTH_SHORT).show();
}
});
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
运行结果:
这个是重头戏了,因为在实际开发中,对话框的样式多种多样,所以这个时候就需要我们用自定义View来展示不同的效果了,这里我们简单演示一个登录的Dialog:
/** 显示自定义View对话框 */
private void showDialogForView() {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("自定义View对话框")
.setIcon(R.mipmap.ic_launcher)
.setView(R.layout.login);
setNegativeButton(builder);
setPositiveButtom(builder)
.create()
.show();
}
login布局;
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<TableRow>
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="用户名:" />
<EditText android:hint="请输入用户名" android:layout_width="match_parent" android:layout_height="wrap_content" />
</TableRow>
<TableRow>
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="密码:" />
<EditText android:hint="请输入登录密码" android:layout_width="match_parent" android:layout_height="wrap_content" />
</TableRow>
</TableLayout>
ProgressDialog,顾名思义,是一个进度条的对话框。我们在使用的时候,只要创建ProgressDialog的实例,并调用显示即可。
使用ProgressDialog创建对话框有如下两种方式:
* 1,创建简单对话框,直接使用ProgressDialog调用其静态方法show()显示对话框。
* 2,创建ProgressDialog,然后调用方法对进度条对话框进行设置,设置完成显示即可。
ProgressDialog有如下常用方法:
* 1,setIndeterminate(boolean indeterminate); 设置对话框里的进度条不显示进度值
* 2,setMax(int max); 设置对话框里的最大进度条
* 3,setMessage(CharSequence message); 设置进度条里显示的消息
* 4,setProgress(int value); 设置进度条的进度值
* 5,setProgressStyle(int style); 设置进度条的样式
下面以实例来演示ProgressDialog的两种使用:
ProgressDialog.show(this, "我是标题", "我是内容");
运行结果:
其中,show()方法还有以下参数:
indeterminate : 设置对话框里的进度条是否显示进度值
cancelable:设置对话框是否可以被取消 (当可以被取消时,用户点击对话框以外地方,对话框会消失)
cancelListener:监听进度条被取消事件
public class ProgressDialogActivity extends AppCompatActivity{
private static final int PROGRESS_MAX = 100;
private ProgressDialog mProgressDialog;
private int mProgress = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progressdialog);
}
public void showProgressDialog(View v) {
mProgress = 0;
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMax(PROGRESS_MAX);
mProgressDialog.setTitle("温馨提示");
mProgressDialog.setMessage("任务正在下载中,请稍候...");
mProgressDialog.setCancelable(false);
mProgressDialog.setIndeterminate(false);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
while(mProgress < PROGRESS_MAX){
mProgress = mProgress + 5;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
mProgressDialog.setProgress(mProgress);
}
if(mProgress >= PROGRESS_MAX){
mProgressDialog.dismiss();
}
}
}).start();
}
}
DatePickerDialog和TimePickerDialog的使用很简单,只需要如下两步:
* 1,创建DatePickerDialog、TimePickerDialog对象,调用它们的show()方法就可以将它们显示出来。
* 2,为DatePickerDialog、TimePickerDialog绑定监听器,这样可以保证当用户选择了日期或者时间后我们这边能给出对于的操作。
DatePickerDialog实例:
public void showDatePickerDialog(View v) {
Calendar c = Calendar.getInstance();
new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Toast.makeText(DateAndTimePickerDialogActivity.this
, "选择了:" + year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日"
, Toast.LENGTH_SHORT).show();
}
// 设置初始日期
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)).show();
TimePickerDialog实例:
public void showTimePickerDialog(View v) {
Calendar c = Calendar.getInstance();
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Toast.makeText(DateAndTimePickerDialogActivity.this
, "选择了:" + hourOfDay + "时" + minute + "分"
, Toast.LENGTH_SHORT).show();
}
// 设置初始时间 true: 表示采用24小时制
}, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true).show();
}
除了上面的各种Dialog之外,我们还可以给Activity设置为Dialog的风格,Activity还是Activity并且有自己的生命周期但是样式就变为Dialog的样式了:
<activity android:name=".MainActivity" android:theme="@android:style/Theme.Material.Dialog">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意:由于使用到了material design样式(5.0之后出的),所以我们需要在build.gradle中将minSdkVersion设置为21。
下载地址:由于以上例子的代码都比较简单,所以这篇博客就不贴出Demo下载了,有问题可以加群讨论:5707887