Dialog总结

来源:互联网 发布:c语言变量名命名规则 编辑:程序博客网 时间:2024/05/16 17:11

    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,像下面这个例子一样:

[java] view plaincopy
  1. @Override  
  2.     protected Dialog onCreateDialog(int id) {  
  3.         // TODO Auto-generated method stub  
  4.         switch (id) {  
  5.         case DIALOG_SOURCE_MESSAGE:  
  6.             // 设置数据源  
  7.             if (mDlgSource == null) {  
  8.                 mDlgSource = new AlertDialog.Builder(SettingsTabActivity.this)  
  9.                         .setTitle(R.string.select_data_source)  
  10.                         .setSingleChoiceItems(R.array.source_item, 0,  
  11.                                 new DialogInterface.OnClickListener() {  
  12.   
  13.                                     @Override  
  14.                                     public void onClick(DialogInterface dialog,  
  15.                                             int which) {  
  16.                                         // TODO Auto-generated method stub  
  17.   
  18.                                         mDlgSource.dismiss();  
  19.                                     }  
  20.                                 }).create();  
  21.             }  
  22.             return mDlgSource;      }  
  23.   
  24.         return null;  
  25.     }  


调用方式:showDialog(DIALOG_SOURCE_MESSAGE);

 

[java] view plaincopy
  1. public void onSourceSettings(View v) {  
  2.     Log.i(TAG, "onSourceSettings");  
  3.     <span style="color:#ff0000;">showDialog(DIALOG_SOURCE_MESSAGE);  
  4. /span>  
  5. }  

4.ProgressDialog 和ProgressBar

一 、ProgressDialog
      ProgressDialog与ProgressBar在UI中动态显示一个加载图标显示程序运行状态。

      ProgressDialog是继承自Android.app.ProgressDialog所设计的互动对话窗口,使用时,必须新建ProgressDialog对象,在运行时会弹出“对话框”作为提醒,此时应用程序后台失去焦点(即此时无法对UI组件进行操作),直到进程结束后,才会将控制权交给应用程序,如果在Activity当中不希望后台失焦,又希望提示User有某后台程序正处于忙碌阶段,那么ProgressBar就会派上用场了。


[java] view plaincopy
  1. ProgressDialog mProgressDialog = new ProgressDialog(TestProgerssDialogActivity.this);  
  2. // 设置mProgressDialog风格  
  3. mProgressDialog.setProgress(ProgressDialog.STYLE_SPINNER);//圆形  
  4.   
  5. mProgressDialog.setProgress(ProgressDialog.STYLE_HORIZONTAL);//水平  
  6.   
  7. // 设置mProgressDialog标题  
  8. mProgressDialog.setTitle("提示");  
  9.   
  10. // 设置mProgressDialog提示  
  11. mProgressDialog.setMessage("这是一个圆形进度条对话框");  
  12.   
  13. // 设置mProgressDialog进度条的图标  
  14. mProgressDialog.setIcon(R.drawable.flag);   
  15.   
  16. // 设置mProgressDialog的进度条是否不明确  
  17. //不滚动时,当前值在最小和最大值之间移动,一般在进行一些无法确定操作时间的任务时作为提示,明确时就是根据你的进度可以设置现在的进度值  
  18. mProgressDialog.setIndeterminate(false);  
  19.   
  20. //mProgressDialog.setProgress(m_count++);  
  21.   
  22.   
  23. // 是否可以按回退键取消  
  24. mProgressDialog.setCancelable(true);  
  25.   
  26. // 设置mProgressDialog的一个Button  
  27. mProgressDialog.setButton("确定"new DialogInterface.OnClickListener()  
  28. {   
  29.   @Override   
  30.   public void onClick(DialogInterface dialog, int which)   
  31.   {   
  32.     dialog.cancel();   
  33.    }   
  34. });  
  35.   
  36. // 显示mProgressDialogmProgressDialog.show();  


[java] view plaincopy
  1. mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {  
  2.           
  3.         @Override  
  4.         public void onCancel(DialogInterface dialog) {  
  5.             // TODO Auto-generated method stub  
  6.             mProgressDialog.hide();  
  7.             webview.stopLoading();  
  8.               
  9.         }  
  10.     });  



          当有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):当进度值改变时引发此事件


[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2.  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.      android:orientation="vertical"  
  4.      android:layout_width="fill_parent"    
  5.      android:layout_height="fill_parent">    
  6.        
  7.      <TextView  
  8.          android:layout_width="fill_parent"    
  9.          android:layout_height="wrap_content"  
  10.          android:text="Welcome to blog" />    
  11.      <ProgressBar  
  12.          android:id="@+id/rectangleProgressBar"    
  13.          style="?android:attr/progressBarStyleHorizontal" mce_style="?android:attr/progressBarStyleHorizontal"     
  14.          android:layout_width="fill_parent"  
  15.          android:layout_height="wrap_content"  
  16.          android:visibility="gone"  
  17.          />  
  18.      <ProgressBar  
  19.          android:id="@+id/circleProgressBar"    
  20.          style="?android:attr/progressBarStyleLarge" mce_style="?android:attr/progressBarStyleLarge"  
  21.          android:layout_width="wrap_content"  
  22.          android:layout_height="wrap_content"  
  23.          android:visibility="gone"  
  24.          />  
  25.         
  26.      <Button android:id="@+id/button"  
  27.              android:text="Show ProgressBar"    
  28.              android:layout_width="wrap_content"  
  29.              android:layout_height="wrap_content"  
  30.              />  
  31.  </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() {@Overridepublic 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() {@Overridepublic 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() {// 一组简单的列表项@Overridepublic void onClick(DialogInterface dialog, int which) {}});// 设置内容为单选框builder.setSingleChoiceItems(new String[] {}, 0, new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});builder.setNegativeButton("不喜欢", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});builder.setPositiveButton("喜欢", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});builder.setNeutralButton("一般", new OnClickListener() {@Overridepublic 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;}


 

 

 

 

 

 

 

原创粉丝点击