zoukankan      html  css  js  c++  java
  • Android中仿IOS提示框的实现

    前言

      在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 }

      在这段代码中,我们看到第7行代码生成一个Dialog对象,然后通过解析样式文件(XML)通过setContentView方法添加到生成的Dialog对象中。下面的代码我们看到通过解析XML样式文件,来设置Dialog显示的文本、取消、确认按钮触发的事件等操作。重点在最后一行代码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的使用方式很相似。

  • 相关阅读:
    Scala 获取当前时间
    mnist 数据集的识别源码解析
    tf.nn.softmax_cross_entropy_with_logits的用法
    softmax函数
    实现手写体 mnist 数据集的识别任务
    MNIST 数据集
    神经网络之激活函数
    模块化神经网络
    np.c_与np.r_
    学习率的选取-滑动平均
  • 原文地址:https://www.cnblogs.com/dreamGong/p/5882348.html
Copyright © 2011-2022 走看看