前言

  在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提示框的实现的更多相关文章

  1. 【转】 Android中退出程序的提示框

    原文网址:http://blog.csdn.net/jumping_android/article/details/7571309 @Override public boolean onKeyDown ...

  2. jquery仿alert提示框、confirm确认对话框、prompt带输入的提示框插件[附实例演示]

    jquery仿alert提示框.confirm确认对话框.prompt带输入的提示框插件实例演示 第一步:引入所需要的jquery插件文件: http://www.angelweb.cn/Inc/eg ...

  3. iOS提示框,为什么你应该使用 MBProgressHUD?

    这是一篇带有一定笔者主观感情色彩的比较文章.文章着重对比github上最流行的两个iOS进度提示控件 MBProgressHUD 与 SVProgressHUD的各自优劣,来帮助初学者找到一个适合的i ...

  4. UWP中的消息提示框(二)

    在UWP中的消息提示框(一)中介绍了一些常见的需要用户主动去干涉的一些消息提示框,接下来打算聊聊不需要用户主动去干涉的一些消息提示框.效果就是像双击退出的那种提示框. 先说说比较简单的吧,通过系统To ...

  5. Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

    Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...

  6. 在ASP.NET中引用自定义提示框

    在html网页中自定义提示框 正文: 在一般的B/S架构中项目,与用户的交互信息是非常重要的.在一般的情况下,设计人员都在把用户信息呈现在html中,用div和span去弹出相关信息.对于一般的情况而 ...

  7. 【转】Android中通知的提示音、震动和LED灯效果小例子

    通知(Notification)是 Android 系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现.发出一条通知后,手机最上方 ...

  8. MFC中添加ToolTip提示框

    PART 1 MFC 对话框中的 Buttton添加提示 例如我们想在一个对话框中的一个button控件添加tooltip,实现的方法如下: 1. 在该对话框的类中添加一个CToolTipCtrl类型 ...

  9. uwp - ContentDialog - 自定义仿iphone提示框,提示框美化

    原文:uwp - ContentDialog - 自定义仿iphone提示框,提示框美化 为了实现我想要的效果花费了我很长时间,唉,当初英语不好好学,翻官网翻了半天才找到,分享给刚入门的新手. 首先看 ...

随机推荐

  1. (五)什么是RDD-Java&Python版Spark

    什么是RDD 视频教程: 1.优酷 2.YouTube RDD是个抽象类,全称为Resilient Distributed Datasets,是一个容错的.并行的数据结构,可以让用户显式地将数据存储到 ...

  2. tomcat linux下的部署安装

    Tomcat在Linux上的安装与配置 转自http://blog.csdn.net/gyming/article/details/36060843     以下使用的Linux版本为: Redhat ...

  3. Linux 查看命令源码

    一.简介 有时候想看看ls.cat.more等命令的源代码,本文介绍相应查看方法. 二.方法 参考: http://blog.csdn.net/silentpebble/article/details ...

  4. uva 129 krypton factors ——yhx

     Krypton Factor  You have been employed by the organisers of a Super Krypton Factor Contest in which ...

  5. SSH整合

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  6. url转码

    var target = encodeURI('我测试'); //--> target = %E6%88%91%E6%B5%8B%E8%AF%95 var afterConvert = deco ...

  7. Fabio

    Fabio 安装和简单使用 Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用 ...

  8. [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  9. 编写轻量ajax组件02-AjaxPro浅析

    前言 上一篇介绍了在webform平台实现ajax的一些方式,并且实现一个基类.这一篇我们来看一个开源的组件:ajaxpro.虽然这是一个比较老的组件,不过实现思想和源码还是值得我们学习的.通过上一篇 ...

  10. 从随机过程到马尔科夫链蒙特卡洛方法(MCMC)

    从随机过程到马尔科夫链蒙特卡洛方法 1. Introduction 第一次接触到 Markov Chain Monte Carlo (MCMC) 是在 theano 的 deep learning t ...