1 .Dialog常用类型
警告对话框:Alertialog
进度对话框:ProgressDialog
日期选择对话框:DatePickerDialog
时间选择对话框:TimePickerDialog
自定义对话框:从Dialog继承
2.Dialog的创建方式
一是直接new一个Dialog对象,然后调用Dialog对象的show和dismiss方法来控制对话框的显示和隐藏。
二是在Activity的onCreateDialog(int id)方法中创建Dialog对象并返回,然后调用Activty的showDialog(int id)和dismissDialog(int id)来显示和隐藏对话框。
区别在于通过第二种方式创建的对话框会继承Activity的属性,比如获得Activity的menu事件等。
3.onCreateDialog的使用
一个Dialog一直被创建及作为Activity的一部分显示的时候,一般情况下,你应该使用回调方法onCreateDialog(int)创建Dialog,当你使用这个方法的时候,Android系统会自动的管理每一个Dialog的状态,并有效的控制着每个Dialog,同样的,每个Dialog也会继承Activity中的某些特性。就像当一个Dialog显示的时候,按下菜单键显示Activity定义的选项菜单或者使用音量键调整音视频音量的大小,当你想显示一个Dialog的时候,调用showDialog(int)方法,传递的参数是唯一能标识你想显示的对话框的整数。
当一个Dialog第一次被调用的时候,Android系统会调用你应该实例化Dialog的Activity的onCreateDialog方法(这里需要注意只有在第一次创建的时候才会调用),这个方法会启动你从showDialog(int)方法里面传递的那个ID参数所定义的Dialog,当你创建成功后,在方法的最后回返回这个Dialog。
在Dialog显示之前,Android也会调用回调函数onPrepareDialog(int,Dialog),当你想在这个Dialog每次打开的时候一些属性得到改变,你可以定义这个方法,这个方法会在每次Dialog打开的时候被调用,onCreateDialog()只会在Dialog第一次打开的时候被调用,(此时调用顺序onCreateDialog->onPrepareDialog)如果你没有定义onPrepareDialog(),每次返回的Dialog都是和第一次显示的Dialog一样,这个方法通过参数会传递一个ID和在onCreateDialog()方法中创建的Dialog。(将要显示的Dialog和它的ID)
当你准备关闭对话框时,你可以通过对这个对话框调用dismiss()来消除它。如果需要,你还可以从这个Activity中调用dismissDialog(int id) 方法,这实际上将为你对这个对话框调用dismiss() 方法。 如果你想使用onCreateDialog(int id) 方法来管理你对话框的状态,然后每次你的对话框消除的时候,这个对话框对象的状态将由该Activity保留。如果你决定不再需要这个对象或者清除该状态是重要的,那么你应该调用removeDialog(int id)。这将删除任何内部对象引用而且如果这个对话框正在显示,它将被消除。
最好的定义onCreateDialog()和onPrepareDialog()中使用switch对传入的id进行下判断,每一个case对应着要启动的Dialog的ID,像下面这个例子一样:
调用方式:showDialog(DIALOG_SOURCE_MESSAGE);
4.ProgressDialog 和ProgressBar
一 、ProgressDialog
ProgressDialog与ProgressBar在UI中动态显示一个加载图标显示程序运行状态。
ProgressDialog是继承自Android.app.ProgressDialog所设计的互动对话窗口,使用时,必须新建ProgressDialog对象,在运行时会弹出“对话框”作为提醒,此时应用程序后台失去焦点(即此时无法对UI组件进行操作),直到进程结束后,才会将控制权交给应用程序,如果在Activity当中不希望后台失焦,又希望提示User有某后台程序正处于忙碌阶段,那么ProgressBar就会派上用场了。
当有ProgressDialog时,点击back时,会首先取消ProgressDialog ,以上代码可以监听进度条被取消事件(也就是点击Back键取消ProgressDialog),此时可以在这里作一些取消后台操作的处理。
二、ProgressBar
XML重要属性
android:progressBarStyle:默认进度条样式
android:progressBarStyleHorizontal:水平样式
重要方法
getMax():返回这个进度条的范围的上限
getProgress():返回进度
getSecondaryProgress():返回次要进度
incrementProgressBy(int diff):指定增加的进度
isIndeterminate():指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate):设置不确定模式下
setVisibility(int v):设置该进度条是否可视
重要事件
onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件
5.DatePickerDialog
Calendar aCalendar = Calendar.getInstance(); int year = aCalendar.get(Calendar.YEAR); int monthOfYear = aCalendar.get(Calendar.MONTH); int dayOfMonth = aCalendar.get(Calendar.DAY_OF_MONTH); // 时间选择对话框 DatePickerDialog dialog = new DatePickerDialog(this, new OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Log.e("DatePickerDialog onDateSet", year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日"); } }, year, monthOfYear, dayOfMonth); dialog.show();
6.TimePickerDialog
TimePickerDialog timePickerDialog = new TimePickerDialog(this, new OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { //设置时间后调用 Log.e("TimePickerDialog onTimeSet", hourOfDay + "时" + minute + "分"); } }, aCalendar.get(Calendar.HOUR_OF_DAY), Calendar.MINUTE, false); timePickerDialog.show();
7.Alertialog
AlertDialog.Builder builder = new Builder(this); builder.setTitle("喜好调查"); builder.setMessage("你喜欢李连杰的电影吗");// 设置显示的消息 builder.setView(new EditText(this));// 设置dialog内容 builder.setIcon(R.drawable.ic_launcher); builder.setCancelable(false);// 设置是否可以点击back键取消,默认为可以的 builder.setItems(new String[] {}, new OnClickListener() {// 一组简单的列表项 @Override public void onClick(DialogInterface dialog, int which) { } }); // 设置内容为单选框 builder.setSingleChoiceItems(new String[] {}, 0, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("不喜欢", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setPositiveButton("喜欢", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("一般", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.show();
8.自定义Dialog
自定义Dialog就是extends Dialog 然后通过setContentView设置其布局
public static MyDialog show(Context context, CharSequence message, boolean cancelable,OnCancelListener cancelListener) { MyDialog dialog = new MyDialog(context,R.style.MyDialog); dialog.setTitle(""); dialog.setContentView(R.layout.mydialog); if(message == null || message.length() == 0) { dialog.findViewById(R.id.message).setVisibility(View.GONE); } else { TextView txt = (TextView)dialog.findViewById(R.id.message); txt.setText(message); } dialog.setCancelable(cancelable); dialog.setOnCancelListener(cancelListener); dialog.getWindow().getAttributes().gravity=Gravity.CENTER; dialog.show(); return dialog; }