前言
在Android开发中,我们有时需要实现类似IOS的对话框。今天我就来总结下,如何通过自定义的开发来实现类似的功能。
自定义Dialog
我们知道Android中最常用的对话框就是Dialog及其派生类。这次我们通过组合的方式来实现一个类似IOS对话框的效果。我们先来看一下布局效果,这个相信大家都能弄出来,在这里我就贴一下最后的效果图(注意:对话框的边缘是圆角的)。
效果图如下:
我们看到,这个和IOS的对话框已经非常相似了,后面我们需要做的就是将其作为一个组件封装起来,实现AlertDialog那样的调用方式提供给调用者使用。下面我们来看一下整个的封装过程。
1、组合使用Dialog进行对象的构建
我们来看一下核心代码:
1 /**
2 * 创建BaseDialog实例
3 * @return
4 */
5 public BaseDialog builder(){
6 LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
7 mDialog = new Dialog(mContext, R.style.Dialog);
8 //设置dialog弹出后会点击屏幕,dialog不消失;点击物理返回键dialog消失
9 mDialog.setCanceledOnTouchOutside(false);
10 View layout = inflater.inflate(R.layout.dialog_normal_layout, null);
11 mDialog.addContentView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
12 //设置Dialog中展示的msg
13 mMessage=(TextView) layout.findViewById(R.id.txtMsg);
14 //设置确认按钮的处理事件
15 mPositiveBtnText=(TextView) layout.findViewById(R.id.txtSubmit);
16 mPositiveBtnText.setOnClickListener(new View.OnClickListener() {
17 @Override
18 public void onClick(View v) {
19 if (mPositiveBtnClickListener != null) {
20 mPositiveBtnClickListener.onClick(mDialog, DialogInterface.BUTTON_POSITIVE);
21 }
22 }
23 });
24
25 mNegativeBtnText=(TextView) layout.findViewById(R.id.txtCancle);
26 mNegativeBtnText.setOnClickListener(new View.OnClickListener() {
27 @Override
28 public void onClick(View v) {
29 if(mNegativeBtnClickListener!=null) {
30 mNegativeBtnClickListener.onClick(mDialog, DialogInterface.BUTTON_NEGATIVE);
31 }
32 }
33 });
34 mDialog.setContentView(layout);
35
36 return this;
37 }
重点在最后一行代码return this而不是mDialog。因为通过返回this对象我们可以使用“链式调用”来不断的进行调用设置等操作,类似Android中的AlertDialog使用方式。
2、自定义Dialog的一些设置
1 /**
2 * 设置Msg
3 * 支持Resource设置
4 * @param message
5 */
6 public BaseDialog setMessage(int message){
7 mMessage.setText(mContext.getText(message).toString());
8 return this;
9 }
10
11 /**
12 * 设置Msg
13 * @param message
14 */
15 public BaseDialog setMessage(String message){
16 mMessage.setText(message);
17 return this;
18 }
19
20
21 public BaseDialog setPositiveButton(int positiveBtnText,DialogInterface.OnClickListener listener) {
22 mPositiveBtnText.setText(mContext.getText(positiveBtnText));
23 mPositiveBtnClickListener = listener;
24 return this;
25 }
26
27 public BaseDialog setPositiveButton(String positiveBtnText,DialogInterface.OnClickListener listener){
28 mPositiveBtnText.setText(positiveBtnText);
29 mPositiveBtnClickListener=listener;
30 return this;
31 }
32
33
34 public BaseDialog setNegativeButton(int negativeBtnText,DialogInterface.OnClickListener listener){
35 mNegativeBtnText.setText(mContext.getText(negativeBtnText));
36 mNegativeBtnClickListener=listener;
37 return this;
38 }
39
40
41 public BaseDialog setNegativeButton(String negativeBtnText,DialogInterface.OnClickListener listener){
42 mNegativeBtnText.setText(negativeBtnText);
43 mNegativeBtnClickListener=listener;
44 return this;
45 }
46
47
48 public void show(){
49 mDialog.show();
50 }
我们看到我们提供了几个比较常用的函数。特别是setPositiveButton等方法,我们直接将事件处理对象传递进来了。下面我们来看下自定义控件的字段定义。代码如下:
1 public BaseDialog(Context context){
2 mContext=context;
3 }
4
5 private Dialog mDialog;
6 protected Context mContext;
7 protected TextView mMessage;
8 protected TextView mPositiveBtnText;
9 protected TextView mNegativeBtnText;
10 protected DialogInterface.OnClickListener mPositiveBtnClickListener;
11 protected DialogInterface.OnClickListener mNegativeBtnClickListener;
我们看到整个自定义Dialog的核心就是mDialog对象,通过组合的方式我们在每一个BaseDialog对象内部都会有一个Dialog对象,BaseDailog对象只是提供了一些外围的显示功能。核心的例如隐藏、显示、弹出效果等方式依赖于嵌入的mDialog对象的。
下面我们来看一下自定义Dialog的调用方式。代码如下:
/**
* 弹出电话确认按钮
*/
new BaseDialog(getActivity())
.builder()
.setMessage("15895991339")
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:15895991339"));
startActivity(intent);
dialog.dismiss();
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
我们看到,调用方式和AlertDialog的使用方式很相似。