对话框一般是出现在Activity纸上的一个小窗口,处于下面的Activity暂时失去焦点,一般用于提示信息和当前应用程序直接相关的小功能。
一、分类
1.AlertDialog:可以有1到3个按钮,单选、复选或列表的对话框,警告对话框可以支持大部分的用户交互。
2.ProgressDialog:显示一个进度环或条,是AlertDialog的扩展,也支持按钮;
3.DatePickerDialog:日期选择
4.TimePickerDialog:时间选择;
二、基本AlertDialog使用
AlertDialog默认为非模态对话框,要想使其为模态对话框,可以设置其cancelable属性
AlertDialog有1-3个按钮,随便点击都会消失,不用主动调用dismiss();
cancel()和dismiss()使对话框取消或者消除,这两个方法的作用是一样的,不过推荐使用dismiss()。
1. 基本Dialog:
/**
* 普通AlertDialog
*/
private void showNormarlDialog(){
AlertDialog.Builder builder = newBuilder(this);
builder.setMessage("是否退出?");
builder.setTitle("提示");
builder.setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
Toast.makeText(ThirdActivity.this, "点击确认",Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton(android.R.string.cancel, newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
Toast.makeText(ThirdActivity.this, "点击取消",Toast.LENGTH_SHORT).show();
}
});
builder.setNeutralButton("中立", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
Toast.makeText(ThirdActivity.this, "点击中立",Toast.LENGTH_SHORT).show();
}
});
builder.create().show();
}
2. 带输入框的Dialog:
/**
* 带输入框的AlertDialog
*/
private void showInputlDialog(){
final EditText text = newEditText(this);
AlertDialog.Builder builder = newBuilder(this);
builder.setMessage("输入姓名");
builder.setView(text);
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
Toast.makeText(ThirdActivity.this, "姓名是:"+text.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.setNeutralButton("中立", null);
builder.create().show();
3. 一组单选框
/**
* 带单选框的AlertDialog
*/
private void showSingleChoiceDialog(){
final String[] items = newString[]{"跑步","游泳"};
AlertDialog.Builder builder = newBuilder(this);
builder.setTitle("今天做什么运动");
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setSingleChoiceItems(items, 1,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();
}
4. 带复选框的AlertDialog
/**
* 带单选框的AlertDialog
*/
private void showMultiChoiceDialog(){
final String[] items = newString[]{"跑步","游泳"};
AlertDialog.Builder builder = newBuilder(this);
builder.setTitle("今天做什么运动");
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setMultiChoiceItems(items,null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which, boolean isChecked) {
// TODO Auto-generated methodstub
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();
}
5. 带列表的AlertDialog
/**
* 带列表框的AlertDialog
*/
private void showListDialog(){
final String[] items = newString[]{"跑步","游泳"};
AlertDialog.Builder builder = newBuilder(this);
builder.setTitle("今天做什么运动");
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.setItems(items, newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();
}
6.自定义布局对话框:
/**
* 自定义对话框
*/
private void showSelfDefinedDialog(){
LayoutInflater inflater =getLayoutInflater();
View layout =inflater.inflate(R.layout.dialog_item, (ViewGroup)findViewById(R.id.dialog));
AlertDialog.Builder builder = newBuilder(this);
builder.setMessage("自定义布局");
builder.setView(layout).setPositiveButton("确定", null);
builder.setNegativeButton("取消", null).create().show();
}
Dialog:item:
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ffffffff"
android:orientation="horizontal">
<TextView
android:id="@+id/tvname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:" />
<EditText
android:id="@+id/etname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="100dip"/>
</LinearLayout>
三、ProgressDialog
一般在耗时的操作之前弹出ProgressDialog提示用户,然后开启一个新线程,执行耗时操作,执行完毕之后通知主程序将ProgressDialog结束。
- 一个简单的例子:值得注意的是ProgressDialog默认是是模态对话框。
private static final intHANDLER_MSG_STOP_PROGRESS = 1;
/**
* 显示进程对话框
*/
private void showProgressDialog(){
mProgress = ProgressDialog.show(this,"正在下载程序", "下载中、、、");
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated methodstub
try {
Thread.sleep(3000);
} catch (InterruptedExceptione) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
mHandler.sendEmptyMessage(HANDLER_MSG_STOP_PROGRESS);
}
}).start();
}
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
// TODO Auto-generated method stub
switch(msg.what){
case HANDLER_MSG_STOP_PROGRESS:
mProgress.dismiss();
break;
}
super.handleMessage(msg);
}
};
- 报告进度的圆形对话框
/**
* 显示圆形进度对话框
*/
private void showSpinnerProgressDialog() {
mProgress = new ProgressDialog(this);
mProgress.setTitle("提示");
mProgress.setMessage("圆形对话框");
mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgress.setIcon(android.R.drawable.dialog_frame);
//设置进度条是否不明确
mProgress.setIndeterminate(false);
mProgress.setCancelable(true);
mProgress.setButton("确定", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
}
});
mProgress.show();
new Thread(){
int iCount = 1;
@Override
public void run() {
// TODO Auto-generated methodstub
try {
while(iCount <= 100) {
Thread.sleep(50);
mProgress.setProgress(iCount++);
}
mHandler.sendEmptyMessage(HANDLER_MSG_STOP_PROGRESS);
} catch (InterruptedExceptione) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
super.run();
}
}.start();
}
- 报告进度的水平对话框
privatevoid showHorizontalProgressDialog() {
mProgress = new ProgressDialog(this);
mProgress.setTitle("提示");
mProgress.setMessage("水平对话框");
mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgress.setIcon(android.R.drawable.dialog_frame);
mProgress.setProgress(100);
//设置进度条是否不明确
mProgress.setIndeterminate(false);
mProgress.setCancelable(false);
mProgress.setButton("确定", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
}
});
mProgress.show();
new Thread(){
int iCount = 1;
@Override
public void run() {
// TODO Auto-generated methodstub
try {
while(iCount <= 100) {
Thread.sleep(50);
mProgress.setProgress(iCount++);
}
mHandler.sendEmptyMessage(HANDLER_MSG_STOP_PROGRESS);
} catch (InterruptedExceptione) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
super.run();
}
}.start();
}
四、使用DialogFragment管理Dialog
- 上面不管AlertDialog还是ProgressDialog的使用,都与其Actiivty没有关系,最明显的表现是当Activity转屏重建后其内部的Dialog都消失了,无法保存其状态,因此Android 3.0引入了基于Fragment的DialogFragment,
- Google推荐尽量使用DialogFragment,因为DialogFragment在手机配置变化(如转屏)在Activity重建时能够自动重建,跳过onCreate() onDestroy()的步骤。
- 所以使用DialogFragment管理Dialog之后,
publicstatic final int DIALOG_NORMAL = 1;
private ProgressDialog mProgress;
public static DialogManager newInstance(inttitle) {
DialogManager frag = newDialogManager();
Bundle args = new Bundle();
args.putInt("title", title);
frag.setArguments(args);
return frag;
}
@Override
public Dialog onCreateDialog(BundlesavedInstanceState) {
// TODO Auto-generated method stub
mContext =getActivity().getApplicationContext();
int title =getArguments().getInt("title");
Dialog dialog = null;
switch(title){
case DIALOG_NORMAL:
dialog = showNormarlDialog();
break;
}
return dialog;
// returnsuper.onCreateDialog(savedInstanceState);
}
/**
* 普通AlertDialog
*/
private Dialog showNormarlDialog(){
AlertDialog.Builder builder = newBuilder(getActivity());
builder.setMessage("是否退出?");
builder.setTitle("提示");
builder.setCancelable(false);
builder.setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
Toast.makeText(mContext,"点击确认", Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton(android.R.string.cancel, newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
Toast.makeText(mContext,"点击取消", Toast.LENGTH_SHORT).show();
}
});
builder.setNeutralButton("中立", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterfacedialog, int which) {
// TODO Auto-generated methodstub
Toast.makeText(mContext,"点击中立", Toast.LENGTH_SHORT).show();
}
});
return builder.create();
}
为什么对于上下文来讲,使用getActivity()没有问题,但是使用getActivity().getApplicationContext()有问题