/FasterDialog

超越Android官方Dialog设计的弹窗框架,高扩展性与高封装性并存,堪称Android上最完美的Dialog框架

Primary LanguageJava

最新gradle依赖库请自行前往 https://www.jitpack.io/#XXQAQ/FasterDialog

效果参见:https://www.jianshu.com/p/c6143fe91c2c

PS:注意注意注意:最新版FasterDialog使用了接口默认实现技术,所以依赖于jdk1.8及以上版本。如果要使用FasterDialog,请将自己的Studio工程设置为1.8!

    //以下所有Dialog均继承自BaseDialog,所有子类可直接调用以下方法
    new BaseDialog(context) {}
            //设置你自己的布局方案,请保证你自己创建的layout文件中的关键控件Id名称与本框架指定控件Id一致
            .setCustomView(R.layout.yourlayout)
            //设置Dialog的样式,默认有 STYLE_BASE  STYLE_TRANSLUCENT  STYLE_ALERT  三种
            .setStyle(STYLE_BASE)
            //Dialog透明度
            .setAlpha(0.8f)
            //Dialog卡片阴影
            .setElevation(8.0f)
            //设置Dialog自动消失时间
            .setAutoDismissTime(1000*5)
            //设置Dialog从某个方向弹窗
            .setPopupFromScreen(Gravity.TOP|Gravity.BOTTOM|Gravity.LEFT|Gravity.RIGHT)
            //设置Dialog从attachView下方弹出
            .setPopupFromView(attachView)
            //设置Dialog从attachView的某个方向弹出
            .setPopupFromView(attachView,Gravity.TOP|Gravity.BOTTOM|Gravity.LEFT|Gravity.RIGHT)
            //从attachView上某点击的位置弹出,参照window任意界面右键菜单效果
            .setPopupFromViewTouchLocation(attachView)
            //最大高度(px)
            .setMaxHeight(100)
            //最大高度占屏幕的百分比(0-1.0f)
            .setMaxHeightPercent(0.5f)
            //最大宽度(px)
            .setMaxWidth(100)
            //最大宽度占屏幕的百分比(0-1.0f)
            .setMaxWidthPercent(0.5f)
            //宽(px)
            .setHeight(100)
            //高满屏
            .setHeightMatch()
            //高内容包裹
            .setHeightWrap()
            //g高占屏幕的百分百0-1.0f
            .setHeightPercent(0.5f)
            //宽(px)
            .setWidth(100)
            //宽满屏
            .setWidthMatch()
            //宽包裹内容
            .setWidthWrap()
            //宽占屏幕的百分百0-1.0f
            .setWidthPercent(0.5f)
            //TAG
            .setTag(null)
            //是否可取消
            .setCancelable(false)
            //是否可点击外部取消
            .setCanceledOnTouchOutside(false)
            //以下三种均为监听器
            .addOnCancelListener(dialog -> {})
            .addOnDismissListener(dialog -> {})
            .addOnShowListener(dialog -> {})
            //显示
            .show();

    //CustomDialog用于高定制化界面,可以将自己构建的任意View直接展示到Dialog上
    new CustomDialog(context)
            //设置需要展示的View
            .setCustomView(view)
            //当Dialog消失以后,是否需要与传入的View断开联系,默认为true
            .setDisconViewOnDismiss(true)
            .show();

    //NormalDialog的使用场景与API均可参照AlertDialog,理论上NormalDialog可以兼容所有App弹窗方案
    //NormalDialog继承于SimpleDialog
    new NormalDialog(context)
            //设置你自己的布局方案,以下为高定制化布局
            .setCustomView(R.layout.yourlayout)
            //Meterail布局样式
            .setMeterailLayoutStyle()
            //标准自定义样式
            .setXQLayoutStyle()
            //大图样式,参照常见广告弹窗
            .setBigImageLayoutStyle()
            //设置图标(Res文件资源)
            .setImageRes(R.mipmap.icon)
            //设置图标(网络资源)
            .setImageUrl("http://...")
            //设置标题
            .setTitle("我是大标题")
            //设置内容
            .setContent("我是内容")
            //设置确定 文字+监听
            .setPositiveText(NormalDialog.CONFIRM)
            .setPositiveListener(new BaseDialog.OnDialogClickListener() {
                @Override
                public void onClick(BaseDialog dialog) {

                }
            })
            //设置取消 文字+监听
            .setNegativeText(NormalDialog.CANCEL)
            .setNegativeListener(new BaseDialog.OnDialogClickListener() {
                @Override
                public void onClick(BaseDialog dialog) {

                }
            })
            //设置中立 文字+监听
            .setNeutralText("随便选")
            .setNeutralListener(new BaseDialog.OnDialogClickListener() {
                @Override
                public void onClick(BaseDialog dialog) {

                }
            })
            .show();

    List<ItemBean> list = new LinkedList<>();
    for (int i=0;i<=0;i++) list.add(new ItemBean("子标题" + i));
    //ListDialog用于列表类性数据选择,注意这里的列表不仅是纯文字列表,也可以是图标列表,并且列表本身也不局限于ListView样式,也可以是GridView样式,如常见的分享界面
    //ListDialog继承与NormalDialog,可以使用NormalDialog所有功能
    new ListDialog(context)
            //设置Dialog布局与Item布局,以下为高定制化布局
            .setCustomView(R.layout.yourLayout,R.layout.itemLayout)
            //Meterail标准样式
            .setMeterailLayoutStyle()
            //Android标准底部弹窗样式
            .setBottomLayoutStyle()
            //标准自定义样式
            .setXQLayoutStyle()
            //参照QQ菜单Menu样式
            .setMenuLayoutStyle()
            //PopupMenu样式
            .setPopupMenuLayoutStyle()
            //设置Item数据列表(这里其实并不限制具体数据类型,只要你提供的对象实现了ItemBehavior接口,那么ListDialog就能识别你的数据源)
            .setItemList(list)
            //设置Item数据列表并追加
            .setItemList(list,true)
            //Item选择回调方法
            .setOnItemSelectedListener(new BaseListDialog.OnItemSelectedListener() {
                @Override
                public void onItemSelected(BaseListDialog dialog, ItemBehavior bean) {

                }
            })
            //设置选择模式,有  CHOOSE_MODE_SINGLE  与  CHOOSE_MODE_MULTI  两种模式
            .setChooseMode(ListDialog.CHOOSE_MODE_SINGLE)
            //设置已选择的数据
            .setSelection(list.get(0))
            //设置已选择的多个数据
            .setSelectionList(list)
            //特殊的Item选择回调方法,因为有些APP的设计是:选择Item的时候不立即回调,在点击确认键以后再将前面点击的结果进行回调,如果你没有这个需求可以无视该方法
            .setPositiveListener(new BaseListDialog.OnItemCompletedListener() {
                @Override
                public void onItemCompleted(BaseListDialog dialog, List<ItemBehavior> list) {

                }
            })
            .show();


    //LoadingDialog ...
    new LoadingDialog(context)
            //设置你自己的布局方案
            .setCustomView(R.layout.yourlayout)
            //设置加载中 文字提示
            .setLoadingText("加载中")
            .show();

    //相比于LoadingDialog,ProgressDialog可以展示更精确的进度值
    //ProgressDialog继承于SimpleDialog
    new ProgressDialog(context)
            //设置你自己的布局方案,以下为高定制化布局
            .setCustomView(R.layout.yourlayout)
            //圆形Meterail布局样式
            .setCircleMeterailLayoutStyle()
            //圆形标准自定义样式
            .setCircleXQLayoutStyle()
            //水平Meterail布局样式
            .setHorizontalMeterailLayoutStyle()
            //水平标准自定义样式
            .setHorizontalXQLayoutStyle()
            //设置进度(0—1.0f)
            .setProgress(0.5f)
            //ProgressDialog设置自动消失以后,不需要外界控制,进度条会自动递增,你可以在业务逻辑完成以后手动调用setProgress(1.0f)再dismiss(),以达到常见的App加载效果
            .setAutoDismissTime(10*1000)
            .setTitle("加载中...")
            .show();

    //EditDialog用于弹框输入场景
    //EditDialog继承于NormalDialog
    new EditDialog(context)
            //设置你自己的布局方案,以下为高定制化布局
            .setCustomView(R.layout.yourlayout)
            //Meterail布局样式
            .setMeterailLayoutStyle()
            //标准自定义样式
            .setXQLayoutStyle()
            //EditDialog天生支持任意数量个EditText,因此可以设置多个InputBean,每个InputBean都代表对应EditText的具体内容,切记如果不设置InputBean将会导致对应的EditText无法显示
            .setInputBean0(new InputBean("请输入昵称","张三"))
            .setInputBean1(new InputBean("请输入密码"))
            .setInputBean(2,new InputBean("验证码",null,null,10, InputType.TYPE_CLASS_NUMBER))
            //输入完成回调
            .setPositiveListener(new BaseEditDialog.OnEditCompletedListener() {
                @Override
                public void onEditCompleted(BaseEditDialog dialog, SparseArray<CharSequence> array) {
                    String str0 = array.get(0).toString();
                    String str1 = array.get(1).toString();
                    String str2 = array.get(2).toString();
                    //更多输入框按规律递加
                }
            })
            .setTitle("请输入...")
            .show();

    //全局弹窗,可以在Service Provider Receive或者其它任何无Context环境下调用,该方案无需系统弹窗权限申请
    DialogManager.showAnywhere(new DialogManager.DialogDelegateActivity.DialogContextProvider() {
        @Override
        public BaseDialog createDialog(Context context) {
            //这里Dialog只需要new出来即可,千万不要手贱去主动show!!!
            return new ProgressDialog(context).setTitle("手机正在被黑客攻击\n10秒后即将重启").setAutoDismissTime(10*1000);
        }
    });

    //目前正在将Dialog与PopupWindow做到无差异化封装,BasePopupWindow还需要后续调整,有需要用到的话请与本人联系
    BasePopupWindow basePopupWindow;