Android自定义通用的Dialog

先来唠唠嗑

昨晚杭州迎来了2018年的第一场雪,还不错,回家之前看到雪了,去年都没看到。雪天路滑,大家注意安全,小心开车!

今天来写一篇关于自定义Dialog的文章,我们在开发中Dialog也是避免不了的,所以封装一个通用的Dialog很有必要,可以避免类的重复,减少代码冗余,我会通过封装一个Java类,然后通过填充不同样式的布局,来达到实现不同的弹出框效果。好了,天也不早了,话不多说,开始今天的表演!

一、Java类的实现(核心代码)

在这个类中,我提供了两套模板,第一套:固定宽高,弹出位置屏幕中间,这里我首先会获取屏幕的宽高,然后宽度取屏幕宽的2/3,高度取屏幕高的1/3,这个是我根据自己项目中的效果去定义的,大家可以根据自己公司的实际效果对这个比例进行修改。第二套:不固定宽高,弹出位置不固定,并且加了一个小的动画,动画资源和Dialog的统一主题我会在下面给出。代码中还有个全局变量tag,这个tag是我用来区分同一个页面中有多个不同的Dialog时作的一个标记,代码的大体描述就是这样,很简单的代码,都能看懂:

package com.jarchie.htgl.views;

import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
import com.jarchie.htgl.R;
import com.jarchie.htgl.utils.ScreenUtil;

/**
 * Created by Jarchie on 2017\12\20.
 * 创建通用的自定义Dialog
 */

@SuppressWarnings({"ConstantConditions", "WeakerAccess"})
public class CommonDialog extends Dialog {

    private static final int WIDTH_PERCENT = 2; //宽度比
    private static final int HEIGHT_PERCENT = 3; //高度比
    private String tag; //自定义标识

    //固定大小Dialog模板
    public CommonDialog(Context context, int layout) {
        this(context, layout, R.style.Theme_dialog, Gravity.CENTER);
    }

    //固定大小Dialog属性
    public CommonDialog(Context context, int layout, int style, int gravity) {
        super(context, style);
        //设置属性
        setContentView(layout);
        int deviceWidth = ScreenUtil.getScreenWidth();
        int deviceHeight = ScreenUtil.getScreenHeight();
        Window window = getWindow();
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        layoutParams.width = deviceWidth / HEIGHT_PERCENT * WIDTH_PERCENT;
        layoutParams.height = deviceHeight / HEIGHT_PERCENT;
        layoutParams.gravity = gravity;
        window.setAttributes(layoutParams);
    }

    //自定义Dialog模板
    public CommonDialog(Context context,int width,int height,int layout,int gravity){
        this(context,width,height,layout,R.style.Theme_dialog,gravity,R.style.pop_anim_style);
    }

    //自定义大小Dialog属性
    public CommonDialog(Context context,int width,int height,int layout,int style,int gravity,int animation){
        super(context,style);
        //设置属性
        setContentView(layout);
        Window window = getWindow();
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        layoutParams.width = width;
        layoutParams.height = height;
        layoutParams.gravity = gravity;
        window.setAttributes(layoutParams);
        window.setWindowAnimations(animation);
    }

    public String getTag() {
        return tag;
    }

    public void setTag(String tag) {
        this.tag = tag;
    }

}

其中ScreenUtil类中的获取屏幕宽高的代码如下:

//获取屏幕的宽
public static int getScreenWidth() {
    final Resources resources = BaseApp.getContext().getResources();
    final DisplayMetrics dm = resources.getDisplayMetrics();
    return dm.widthPixels;
}

//获取屏幕的高
public static int getScreenHeight() {
    final Resources resources = BaseApp.getContext().getResources();
    final DisplayMetrics dm = resources.getDisplayMetrics();
    return dm.heightPixels;
}

其中BaseApp.getContext()就是自定义的Application中获取全局上下文对象的方法,这里就不再贴代码了。

接着来说说自定义的主题,代码如下:


还有自定义的动画的style,代码如下:


其中,动画资源代码如下:



    


    

好了,编写过程就是这些,下面来看看具体使用方法。

二、举个栗子

1、先来看布局文件 dialog_alert_layout.xml,我们需要编写一个弹出框的布局文件,这个待会要用到的:




    

    

    

        

        
    

效果如下图所示:

Android自定义通用的Dialog_第1张图片

2、然后在我们需要使用弹出框的页面中去实例化我们的这个对象,并且绑定内部的控件,做相应的动态处理,比如更改标题的文本内容、处理按钮的点击事件这些:

实例化Dialog对象:

mCommonDialog = new CommonDialog(getContext(), R.layout.dialog_alert_layout);
mCommonDialog.setCanceledOnTouchOutside(false);
mCommonDialog.setCancelable(false);

绑定内部控件:

btnConfirm = mCommonDialog.findViewById(R.id.btn_confirm);
btnCancel = mCommonDialog.findViewById(R.id.btn_cancel);

添加点击事件:

btnConfirm.setOnClickListener(this);
btnCancel.setOnClickListener(this);

处理点击事件:

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.btn_login_out:
            mCommonDialog.show();
            break;
        case R.id.btn_confirm:
            
            break;
        case R.id.btn_cancel:
            mCommonDialog.cancel();
            break;
    }
}

可以看到这些使用方法和我们平时的普通控件的使用是完全一样的,之所以这样写就是为了灵活的去适用不同的业务场景,有时候封装好的一句话调用的控件并不一定适用于你的需求,这种方式虽然使用比那种完全方式代码要多一些,但是很灵活,当然了,你也可以基于这个类,继续接着往上层封装一个工具类,对外提供好显示隐藏处理点击事件的方法,直接调用相对应的方法也是可以的,这里就不再多讲了。
三、福利

快过年了,给大家个小福利,推荐一个高集成的快速创建对话框的库给大家,双手奉上项目地址:

https://github.com/yilylong/CBDialog
放张图吧,简单介绍:

Android自定义通用的Dialog_第2张图片

今天的内容就这么多,谢谢各位小伙伴!

你可能感兴趣的:(Android自定义通用的Dialog)