[android]我是这样写自定义Dialog的

作者: 路人葵 | 来源:发表于2016-07-13 09:54 被阅读8138次

    1、前言#

    然而就先特么扯个犊子…#####
    * 其实,关于android的自定义dialog网络上很多文章。我也不知道我这篇会不会特别点~
      小渣渣我只想写点个人感觉有意义的东西。
    (其实也是不知道写啥啦,欢迎大家有想了解的知识点、或者想法可以私信或  者留言给本渣~
      个人感觉有意义的有兴趣的就写出来~hhhhhh  )
     
      不扯犊子了…感觉扯犊子会被打…
    

    2、概述

    • 百度上各种自定义对话框很多,可是感觉都好乱呀呀呀呀。之前写自定义对话框的代码总是巴拉到一团,卧槽……看着就烦,改起来更烦…对于近视度数极高的我来说实在是受不了(额,虽然好像和近视没啥关系…别在意这了)

    所以,本文的目的就是骗关注的…个屁,就是介绍个人一个写自定义Dialog的方式。

    大概就是:

    • 提高可维护性.
    • 代码结构思路清晰点,不会像狗皮膏药黏在一团.
    • 个人感觉可控性蛮高.
    • 然后自己感觉下吧……
      (优缺点什么的,都是自己体会下的好,我目前所知道的好方式不一定是最好的方式,要不然我怎么自称本渣渣呢,毕竟牛在天上飞,我在地上吹~)

    3、思路#

    首先,dialog这个玩意儿我们还是很经常用到的,不同的需求可能涉及不一样的dialog,所以咱写一个自定义dialog的父类,父类就一个很普通dialog嘛,然后,为人基本准则给你了,儿子你爱咋整咋整吧。恩的,把儿子放养去~你啥功能自己搞去,爹爹我只要你还是个人(dialog)就好了!

    就按着这个思路咱敲代码去!
    示例,一个支付时需要输入密码的一个对话框,需要显示交易金额,输入密码框。

    效果图:#####
    自定义Dialog.gif

    4、代码

    *前面说的都是打屁,还挺悠长的言归正传代码走起来

    1、首先按照思路,我们不能像平常写自定义Dialog一般,一股脑的吧嗒吧嗒的鞋写出来.所以先写一个Dialog的父类。

    ☆☆☆☆☆

    • 既然是父类,所以我们新建个抽象类。我这边就取名叫做BaseDialog了.(其实写完这个基本类这篇文章就GG了)
    public abstract class BaseDialog {
    
    //这些属性,Context 是肯定要的,基本对话框要用它
    protected Context context;
    private Display display;//这个设置显示属性用的 
    private Dialog dialog;//自定义Dialog,Dialog还是要有一个的吧
       
    //对话框布局的样式ID (通过这个抽象方法,我们可以给不同的对话框设置不同样式主题)
     protected abstract int getDialogStyleId();
    //构建对话框的方法(都说了是不同的对话框,布局什么的肯定是不一样的)
    protected abstract View getView();
    
    //构造方法 来实现 最基本的对话框
    public BaseDialog(Context context) {  
         this.context = context;
         WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
         display = windowManager.getDefaultDisplay();
         //在这里初始化 基础对话框s    
         if (getDialogStyleId() == 0){     
               dialog = new Dialog(context, DIALOG_COMMON_STYLE );   
         }else {       
               dialog = new Dialog(context, getDialogStyleId());    
         }    
         // 调整dialog背景大小    
         getView().setLayoutParams(new FrameLayout.LayoutParams((int) (display.getWidth() * 0.8), LinearLayout.LayoutParams.WRAP_CONTENT));    
    dialog.setContentView(getView());    
         //隐藏系统输入盘 
         dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
      }
    
       /** * Dialog 的基础方法,
        *凡是要用的就在这写出来,然后直接用对话框调本来的方法就好了,不够自己加~hhh */
      
      //像这类设置对话框属性的方法,就返回值写自己,这样就可以一条链式设置了
      public BaseDialog setCancelable(boolean cancel) {  
         dialog.setCancelable(cancel);   
         return this;
       }
    
       public void show() {    
         dialog.show();
      }
    
       public void dismiss(){    
            dialog.dismiss();
       }
    
       public boolean isShowing(){ 
              return dialog.isShowing();
       }
    
      public BaseDialog setdismissListeren(DialogInterface.OnDismissListener dismissListener){    
          dialog.setOnDismissListener(dismissListener);    
          return this;
       }
    
    }
    
    • 上面有俩个样式,样式的话写在res/values/styles.xml中.
    <!-- 对话框样式(要什么样式自己网上找去…应该没有比我懒得吧) : --><!-- 自定义仿IOS的AlertDialog的样式 -->
    <style name="dialog_ios_style" parent="@android:style/Theme.Dialog">   
    <item name="android:windowBackground">@android:color/transparent</item>    
    <item name="android:windowContentOverlay">@null</item>    
    <item name="android:windowIsFloating">true</item>  
    <item name="android:windowFrame">@null</item>    
    <item name="android:backgroundDimEnabled">true</item>  
    <item name="android:windowNoTitle">true</item>    
    <item name="android:windowIsTranslucent">true</item>
    </style>
    
    <!-- 一个很正常的样式 -->
    <style name="common_dialog_style" parent="@android:style/Theme.Dialog">    
    <item name="android:windowBackground">@android:color/transparent</item>    
    <item name="android:windowFrame">@null</item>    
    <item name="android:windowNoTitle">true</item>    
    <item name="android:windowIsFloating">true</item>    
    <item name="android:windowIsTranslucent">true</item>    
    <item name="android:windowContentOverlay">@null</item>    
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>    
    <item name="android:backgroundDimEnabled">true</item>
    </style>
    

    *最重要的父类就写好了然后,所有的自定义对话框继承他,实现自己的方法就好了~~

    2、然后咱写一个自定义的支付确认对话框.(这只是个例子,爱咋玩,自己写去,小渣渣比较懒。。就举这一个例子啦QAQ,其实觉得举太多也没什么卵用)
    • 按照上面说的写个类继承刚刚写的BaseDialog
    public class PassWordDialog extends BaseDialog {
    
        //这些属性无视就好了,就是布局的控件
         private TextView btnDialogPwdTitle;
         private TextView tvDialogPwdTitle;
         private LinearLayout layoutDialogPwdMoney;
         private EditText etDialogPwd;
         private LinearLayout layoutDialogPwd;
         private RelativeLayout layoutPwd;
         private TextView tvDialogPwdMoney;
    
          //构造方法还是要的哈  
         public PassWordDialog(Context context) {    super(context);}
    
         //设置对话框的样式
         @Override
         protected int getDialogStyleId() {    
              return BaseDialog.DIALOG_COMMON_STYLE;
         }
    
        //继承于BaseDialog的方法,设置布局用的,这样对话框张啥样久随心所欲啦
        @Override
        protected View getView() {    
           // 获取Dialog布局    
           View view = LayoutInflater.from(context).inflate(R.layout.dialog_pwd, null);   
        
           //得到各种view
           layoutPwd= ViewUtility.findViewById(view,R.id.rl_dialog_pwd);    
           tvDialogPwdMoney = ViewUtility.findViewById(view, R.id.tv_dialog_pwd_money);    
           btnDialogPwdTitle = ViewUtility.findViewById(view,R.id.btn_dialog_pwd_title);    
           tvDialogPwdTitle = ViewUtility.findViewById(view,R.id.tv_dialog_pwd_title);    
           layoutDialogPwdMoney = ViewUtility.findViewById(view,R.id.layout_dialog_pwd_money);    
           etDialogPwd = ViewUtility.findViewById(view,R.id.et_dialog_pwd);    
            layoutDialogPwd = ViewUtility.findViewById(view,R.id.layout_dialog_pwd);    
            //初始化一些控件的方法(放下面写啦~)
            initViewEvent();    
            return view;
         }
    }
    
    • 上面这个类需要的元素在补一下。一个是布局文件(怎么排版看个人心意了),一个是初始化一些个人觉得所需要的控件监听.
    1. 先贴下监听事件的方法.
    //View的事件
    private void initViewEvent() {
         //设置对话框那个叉叉的方法,点击关闭对话框
         btnDialogPwdTitle.setOnClickListener(new View.OnClickListener() {    
            @Override        
            public void onClick(View v) { 
                  dismiss();        
            }    
         });
     }
    
    1. 可能需求是,需要根据用户输入的金额在对话框显示支付金额,好的,so easy那就给个设置金额的方法.
     /** * 设置金额 */
     public BaseDialog setMoney(String s){ 
          tvDialogPwdMoney.setText(s);    
          return this;
     }
    
    1. 如果实在需要用到对话框里的控件.
    /** * 得到密码框 */
    public EditText getEditText(){    
          return etDialogPwd;
    }
    
    1. 然后……想咋玩?你说,然后该咋整咋整好不.

    2. 最后贴个布局文件.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout    
    xmlns:android="http://schemas.android.com/apk/res/android"    
    android:id="@+id/rl_dialog_pwd"    
    android:orientation="vertical"    
    android:layout_width="match_parent"    
    android:layout_height="wrap_content"    
    android:background="#ffffff"    
    >    <!-- 取消对话框按钮图标 -->    
    <TextView        
    android:id="@+id/btn_dialog_pwd_title"        
    android:layout_width="wrap_content"        
    android:layout_height="wrap_content"        
    android:text="X"        
    android:textSize="30sp"       
    android:layout_margin="10dp"        />   
    <TextView        
    android:id="@+id/tv_dialog_pwd_title"        
    android:layout_width="wrap_content"        
    android:layout_height="wrap_content"       
    android:text="请输入支付密码"        
    android:textSize="20sp"        
    android:layout_margin="18dp"        
    android:layout_toRightOf="@id/btn_dialog_pwd_title"        />    
    <!-- 修饰线-->    
    <View        
    android:layout_width="match_parent"        
    android:layout_height="1dp"        
    android:background="#ff0000"        
    android:layout_below="@id/btn_dialog_pwd_title"        />    
    <LinearLayout        
    android:id="@+id/layout_dialog_pwd_money"        
    android:layout_width="match_parent"        
    android:layout_height="100dp"        
    android:layout_below="@id/btn_dialog_pwd_title"        
    android:gravity="center"        >        
    <TextView            
    android:layout_width="wrap_content"            
    android:layout_height="wrap_content"            
    android:text="¥"            
    android:textSize="40sp"            
    android:layout_gravity="center_vertical"            />        
    <TextView            
    android:id="@+id/tv_dialog_pwd_money"            
    android:layout_width="wrap_content"            
    android:layout_height="wrap_content"            
    android:text="40.95"            
    android:textSize="40sp"            
    android:layout_gravity="center_vertical"            />    
    </LinearLayout>    
    <!-- 修饰线-->    
    <View        
    android:layout_width="match_parent"        
    android:layout_height="1dp"        
    android:background="#aaaaaa"        
    android:layout_marginLeft="20dp"        
    android:layout_marginRight="20dp"        
    android:layout_below="@id/layout_dialog_pwd_money"        />    
    <!-- 密码输入框-->    
    <LinearLayout        
    android:id="@+id/layout_dialog_pwd"        
    android:layout_width="match_parent"        
    android:layout_height="80dp"        
    android:layout_below="@id/layout_dialog_pwd_money"        >        
    <EditText            
    android:id="@+id/et_dialog_pwd"            
    android:layout_width="match_parent"            
    android:layout_height="wrap_content"            
    android:background="@android:drawable/edit_text"            
    android:layout_gravity="center"            
    android:layout_marginLeft="10dp"            
    android:layout_marginRight="10dp"            
    android:inputType="numberPassword"            
    android:longClickable="false"            
    android:maxLength="6"            
    android:clickable="false"            />    
    </LinearLayout>
    </RelativeLayout>
    

    4、引用


    * 对话框已经写好了,调用方面那就真JB爽歪了.
    public void showDialog(View view){     
           //恩,对的,就这么一行代码就够了,因为设置属性的方法返回值是自己,所以一条链就点好了
           new PassWordDialog(this).setMoney("10").setCancelable(false).show();
     }
    

    5、这作者真烦,啰嗦一大堆终于讲完了~

    ※然而,我还想啰嗦下!咬我呀!

    路人葵:希望可帮到有需要的小伙伴们~
    那啥…有想研究的代码呀,功能呀,建议呀,可以评论留言私信~
    虽然太高深的也不会,可这不正在学么~
    

    相关文章

      网友评论

      • 阿里娃娃:ViewUtility 也没有定义 有源码吗
      • 阿里娃娃:DIALOG_COMMON_STYLE 是什么呢 没有定义啊,
      • 断了谁的弦:请问这比直接setView()有什么优势?
        路人葵: @断了谁的弦_7852 第一个感觉是思路,代码清楚了很多,容易找问题,和修改。第二个感觉就是,如果很多地方用到相同的对话框,不用写那么多次。
      • 摆渡_:通俗易懂。
      • nbpzjy:我偷偷告诉你,我是比渣还渣的渣渣 (﹁"﹁)
        nbpzjy:@路人葵 ✌
        路人葵:@nbpzjy 那咱俩渣渣一起脱渣吧。有问题可以多交流~
      • 088bceee8087:至于扩展性,你的并不大,只是组合进来dialog,对外却阉割掉它的接口,后期扩展只能修改基类,显然不是优雅的实现。事实上继承alertdialog之类的更便捷一些。
        路人葵:@喜欢延安的小雨 回去试试~谢谢建议😜
      • 薄炳鑫:android dialog 学习
      • fe2a5bcdf6ea:巴错巴错
        路人葵:@蹦蹦跳跳真可爱 : :joy: 谢啦谢啦~~~
      • 路人葵: :stuck_out_tongue_closed_eyes: 感觉哪里不好就狠狠地批判我把 ,嘎嘎。
      • KunMinX:马勒戈壁,居然看完了
        路人葵:@简洁笔记 你也在自学android 么?? 一起学吧~一个人蛮闲的

      本文标题:[android]我是这样写自定义Dialog的

      本文链接:https://www.haomeiwen.com/subject/adxsjttx.html