关于自定义Dialog的那些事

Dialog也就是传说中的弹出框,系统自带的一些布局和功能比较简单,一般来说满足不了开发的需求,因此,需要我们自己动手,来实现一个自定义的Dialog。

首先,如果要实现一个自己的Dialog,我们需要继承自Dialog。Dialog的构造函数一共有三种格式,我们至少需要生命其中的一种形式,才能够使用。

构造函数的格式如下:

1.public MyCameraDialog(Context context,boolean cancelable,
OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
2.public MyCameraDialog(Context context,int theme) {
super(context, theme);
}
3.public MyCameraDialog(Context context) {
super(context);
}


在这三种构造函数,我们最常用的是第二种,也就是需要上下文对象和样式的构造函数,当我们使用这个构造函数的时候,我们需要指定一个样式,比如说是没有标题等。

当然,我们可以用第三个构造函数,只传入一个上下文对象,然后设置一个我们指定的默认的样式。就像下面这样:

public MyCameraDialog(Context context) {

this(context,R.style.MyStyle);

}

这样当我们创建窗口的时候,就可以使用我们默认的显示样式了,R.style.MyStyle这个是指在style文件中设置的一个Dialog的样式,下面是常用的设置。

[html]  view plain copy
  1. <style name="CustomDialog" parent="android:style/Theme.Dialog">  
  2.   
  3.         <!-- 背景颜色及透明程度 -->  
  4.         <item name="android:windowBackground">@android:color/transparent</item>  
  5.         <!-- 是否有标题 -->  
  6.         <item name="android:windowNoTitle">true</item>  
  7.         <!-- 是否浮现在activity之上 -->  
  8.         <item name="android:windowIsFloating">true</item>  
  9.         <!-- 是否模糊 -->  
  10.         <item name="android:backgroundDimEnabled">false</item>  
  11.         <item name="android:windowFrame">@null</item>  
  12.     </style>  

设置好样式之后,我们需要用我们自定义的布局,来设置显示的画面。

在Dialog里面,如果我们想使用自己的自定义布局,非常简单,我们只要重写onCreate方法即可,就像是我们在写一个Activity的布局一样,在onCreate里面,我们可以使用

setContentView(R.layout.dialog);来设置我们要填充的布局,然后对布局里面控件的事件绑定也都可以进行。

在设置好这些东西之后,我们就可以使用new MyDialog(context).show()来显示我们自定义的Dialog了。

下面是一个用来选择照片或者是拍照来获取照片的自定义Dialog的范例,大家可以参考

[java]  view plain copy
  1. /** 
  2.  * 为符合软件整体风格而自定义的选择照片来源dialog 
  3.  *  
  4.  * @author ZhaoKaiQiang 
  5.  *  
  6.  *         Time:2014年3月12日 
  7.  */  
  8. public class MyCameraDialog extends Dialog {  
  9.   
  10.     private TextView tv_my_camera_take_photo;  
  11.     private TextView tv_my_camera_from_album;  
  12.     private Context mContext;  
  13.     private static int mTheme = R.style.MyDialog;  
  14.   
  15.     /** 
  16.      * 自定义Dialog 
  17.      *  
  18.      * @param context 
  19.      *            上下文 
  20.      * @param activity 
  21.      *            Dialog所在的Activity,用于点击“确定”按钮后finish所在的Activity 
  22.      * @param title 
  23.      *            文本内容 
  24.      * @param btnString 
  25.      *            按钮上的文字 
  26.      * @param theme 
  27.      *            样式 
  28.      */  
  29.     public MyCameraDialog(Context context, int theme) {  
  30.         super(context, theme);  
  31.         this.mContext = context;  
  32.     }  
  33.   
  34.     public MyCameraDialog(Context context) {  
  35.         super(context, mTheme);  
  36.         this.mContext = context;  
  37.     }  
  38.   
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.dialog_select_photo);  
  43.         tv_my_camera_take_photo = (TextView) findViewById(R.id.tv_my_camera_take_photo);  
  44.         tv_my_camera_from_album = (TextView) findViewById(R.id.tv_my_camera_from_album);  
  45.   
  46.         tv_my_camera_take_photo  
  47.                 .setOnClickListener(new android.view.View.OnClickListener() {  
  48.   
  49.                     @Override  
  50.                     public void onClick(View v) {  
  51.                         MyCameraDialog.this.dismiss();  
  52.                         //拍照选择  
  53.                         Intent intent = new Intent(  
  54.                                 "android.media.action.IMAGE_CAPTURE");  
  55.                         ((Activity) mContext).startActivityForResult(intent, 0);  
  56.   
  57.                     }  
  58.                 });  
  59.   
  60.         tv_my_camera_from_album  
  61.                 .setOnClickListener(new android.view.View.OnClickListener() {  
  62.   
  63.                     @Override  
  64.                     public void onClick(View v) {  
  65.                         //从相册选择  
  66.                         MyCameraDialog.this.dismiss();  
  67.                         Intent intent = new Intent(  
  68.                                 Intent.ACTION_PICK,  
  69.                                 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  
  70.                         ((Activity) mContext).startActivityForResult(intent, 1);  
  71.                     }  
  72.                 });  
  73.   
  74.     }  
  75.   
  76. }  

你可能感兴趣的:(关于自定义Dialog的那些事)