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,像下面这个例子一样:
- @Override
- protected Dialog onCreateDialog(int id) {
- // TODO Auto-generated method stub
- switch (id) {
- case DIALOG_SOURCE_MESSAGE:
- // 设置数据源
- if (mDlgSource == null) {
- mDlgSource = new AlertDialog.Builder(SettingsTabActivity.this)
- .setTitle(R.string.select_data_source)
- .setSingleChoiceItems(R.array.source_item, 0,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- mDlgSource.dismiss();
- }
- }).create();
- }
- return mDlgSource; }
- return null;
- }
调用方式:showDialog(DIALOG_SOURCE_MESSAGE);
- public void onSourceSettings(View v) {
- Log.i(TAG, "onSourceSettings");
- <span style="color:#ff0000;">showDialog(DIALOG_SOURCE_MESSAGE);
- /span>
- }
4.ProgressDialog 和ProgressBar
一 、ProgressDialog
ProgressDialog与ProgressBar在UI中动态显示一个加载图标显示程序运行状态。
ProgressDialog是继承自Android.app.ProgressDialog所设计的互动对话窗口,使用时,必须新建ProgressDialog对象,在运行时会弹出“对话框”作为提醒,此时应用程序后台失去焦点(即此时无法对UI组件进行操作),直到进程结束后,才会将控制权交给应用程序,如果在Activity当中不希望后台失焦,又希望提示User有某后台程序正处于忙碌阶段,那么ProgressBar就会派上用场了。
- ProgressDialog mProgressDialog = new ProgressDialog(TestProgerssDialogActivity.this);
- // 设置mProgressDialog风格
- mProgressDialog.setProgress(ProgressDialog.STYLE_SPINNER);//圆形
- mProgressDialog.setProgress(ProgressDialog.STYLE_HORIZONTAL);//水平
- // 设置mProgressDialog标题
- mProgressDialog.setTitle("提示");
- // 设置mProgressDialog提示
- mProgressDialog.setMessage("这是一个圆形进度条对话框");
- // 设置mProgressDialog进度条的图标
- mProgressDialog.setIcon(R.drawable.flag);
- // 设置mProgressDialog的进度条是否不明确
- //不滚动时,当前值在最小和最大值之间移动,一般在进行一些无法确定操作时间的任务时作为提示,明确时就是根据你的进度可以设置现在的进度值
- mProgressDialog.setIndeterminate(false);
- //mProgressDialog.setProgress(m_count++);
- // 是否可以按回退键取消
- mProgressDialog.setCancelable(true);
- // 设置mProgressDialog的一个Button
- mProgressDialog.setButton("确定", new DialogInterface.OnClickListener()
- {
- @Override
- public void onClick(DialogInterface dialog, int which)
- {
- dialog.cancel();
- }
- });
- // 显示mProgressDialogmProgressDialog.show();
- mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- // TODO Auto-generated method stub
- mProgressDialog.hide();
- webview.stopLoading();
- }
- });
当有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):当进度值改变时引发此事件
- <?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">
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Welcome to blog" />
- <ProgressBar
- android:id="@+id/rectangleProgressBar"
- style="?android:attr/progressBarStyleHorizontal" mce_style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- />
- <ProgressBar
- android:id="@+id/circleProgressBar"
- style="?android:attr/progressBarStyleLarge" mce_style="?android:attr/progressBarStyleLarge"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:visibility="gone"
- />
- <Button android:id="@+id/button"
- android:text="Show ProgressBar"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
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;
}