前言
在Android开发中,我们有时需要实现类似IOS的对话框。今天我就来总结下,如何通过自定义的开发来实现类似的功能。
自定义Dialog
我们知道Android中最常用的对话框就是Dialog及其派生类。这次我们通过组合的方式来实现一个类似IOS对话框的效果。我们先来看一下布局效果,这个相信大家都能弄出来,在这里我就贴一下最后的效果图(注意:对话框的边缘是圆角的)。
效果图如下:
我们看到,这个和IOS的对话框已经非常相似了,后面我们需要做的就是将其作为一个组件封装起来,实现AlertDialog那样的调用方式提供给调用者使用。下面我们来看一下整个的封装过程。
1、组合使用Dialog进行对象的构建
/** * 创建BaseDialog实例 * @return */ public BaseDialog builder(){ LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mDialog = new Dialog(mContext, R.style.Dialog); //设置dialog弹出后会点击屏幕,dialog不消失;点击物理返回键dialog消失 mDialog.setCanceledOnTouchOutside(false); View layout = inflater.inflate(R.layout.dialog_normal_layout, null); mDialog.addContentView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); //设置Dialog中展示的msg mMessage=(TextView) layout.findViewById(R.id.txtMsg); //设置确认按钮的处理事件 mPositiveBtnText=(TextView) layout.findViewById(R.id.txtSubmit); mPositiveBtnText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mPositiveBtnClickListener != null) { mPositiveBtnClickListener.onClick(mDialog, DialogInterface.BUTTON_POSITIVE); } } }); mNegativeBtnText=(TextView) layout.findViewById(R.id.txtCancle); mNegativeBtnText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mNegativeBtnClickListener!=null) { mNegativeBtnClickListener.onClick(mDialog, DialogInterface.BUTTON_NEGATIVE); } } }); mDialog.setContentView(layout); return this; }
在这段代码中,我们看到第7行代码生成一个Dialog对象,然后通过解析样式文件(XML)通过setContentView方法添加到生成的Dialog对象中。下面的代码我们看到通过解析XML样式文件,来设置Dialog显示的文本、取消、确认按钮触发的事件等操作。重点在最后一行代码return this而不是mDialog。因为通过返回this对象我们可以使用“链式调用”来不断的进行调用设置等操作,类似Android中的AlertDialog使用方式。
2、自定义Dialog的一些设置
/** * 设置Msg * 支持Resource设置 * @param message */ public BaseDialog setMessage(int message){ mMessage.setText(mContext.getText(message).toString()); return this; } /** * 设置Msg * @param message */ public BaseDialog setMessage(String message){ mMessage.setText(message); return this; } public BaseDialog setPositiveButton(int positiveBtnText,DialogInterface.OnClickListener listener) { mPositiveBtnText.setText(mContext.getText(positiveBtnText)); mPositiveBtnClickListener = listener; return this; } public BaseDialog setPositiveButton(String positiveBtnText,DialogInterface.OnClickListener listener){ mPositiveBtnText.setText(positiveBtnText); mPositiveBtnClickListener=listener; return this; } public BaseDialog setNegativeButton(int negativeBtnText,DialogInterface.OnClickListener listener){ mNegativeBtnText.setText(mContext.getText(negativeBtnText)); mNegativeBtnClickListener=listener; return this; } public BaseDialog setNegativeButton(String negativeBtnText,DialogInterface.OnClickListener listener){ mNegativeBtnText.setText(negativeBtnText); mNegativeBtnClickListener=listener; return this; } public void show(){ mDialog.show(); }
我们看到我们提供了几个比较常用的函数。特别是setPositiveButton等方法,我们直接将事件处理对象传递进来了。下面我们来看下自定义控件的字段定义。代码如下:
public BaseDialog(Context context){ mContext=context; } private Dialog mDialog; protected Context mContext; protected TextView mMessage; protected TextView mPositiveBtnText; protected TextView mNegativeBtnText; protected DialogInterface.OnClickListener mPositiveBtnClickListener; 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的使用方式很相似。
以上这篇Android中仿IOS提示框的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持找一找教程网。