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的使用方式很相似。

  • 相关阅读:
    C++中整型变量的存储大小和范围
    A1038 Recover the Smallest Number (30 分)
    A1067 Sort with Swap(0, i) (25 分)
    A1037 Magic Coupon (25 分)
    A1033 To Fill or Not to Fill (25 分)
    A1070 Mooncake (25 分)
    js 获取控件
    C#代码对SQL数据库添加表或者视图
    JS 动态操作表格
    jQuery取得下拉框选择的文本与值
  • 原文地址:https://www.cnblogs.com/dreamGong/p/5882348.html
Copyright © 2011-2022 走看看