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


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、这作者真烦,啰嗦一大堆终于讲完了~

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

路人葵:希望可帮到有需要的小伙伴们~
那啥…有想研究的代码呀,功能呀,建议呀,可以评论留言私信~
虽然太高深的也不会,可这不正在学么~
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容