自定义通用dialogFragment

代码地址如下:
http://www.demodashi.com/demo/12844.html

前言

之前写过一篇dialogFragmnet封装默认dialog的文章
DialogFragment创建默认dialog
这篇将介绍用dialogFragment创建dialog的另一种方式,将使dialog使用更加便捷,更加灵活。

程序实现

一.提前配置

此demo使用到了butterKnife,首先大家需要在自己app module中配置butterKnife,如下:

//butterKnife
compile 'com.jakewharton:butterknife:8.5.1'
//这条千万不能忘记!!
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
二.继承AppCompatDialogFragment封装一个AppDialogFragment类

AppDialogFragment通过重写dialogFragment的onCreateView方法来达到自定义布局的效果,这样就能使布局更灵活

   @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mLayoutView = inflater.inflate(getLayoutId(), container, false);
        mUnbinder= ButterKnife.bind(this,mLayoutView);//绑定framgent
        //初始化
        onCreateFragmentView(inflater, container, savedInstanceState);
        return mLayoutView;
    }

然后在 onCreateFragmentView 方法中做一些涉及到 dialog相关的数据初始化
为了控制dialog大小,我们需要在AppDialogFragment的onStart方法中做些控制dialog大小的代码:

    @Override
    public void onStart() {
        super.onStart();
        //设置窗口属性
        setDialog();
    }

    /**设置窗口属性**/
    private void setDialog(){
        Dialog dialog=getDialog();
        if(dialog!=null) {
          //返回键是否消失
//        getDialog().setCancelable(mBackCancel);
            dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
                @Override
                public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {
                    if (keyCode == KeyEvent.KEYCODE_BACK) {
                        return !mBackCancel;
                    }
                    return false;
                }
            });
            //触碰dialog外面是否消失
            dialog.setCanceledOnTouchOutside(mTouchOutsideCancel);
            //设置窗口大小
            setWindowSize(dialog);
        }
    }

最终达到的效果是将dialog的大小封装到一个double数组中
最后在AppDialogFragment中写一些基本的属性设置

//设置dialog背景色
setBackGroundId(int rId)
//设置点击返回键是否关闭dialog
setCancel(boolean canDismiss)
//设置点击屏幕外面是否关闭dialog
setCancelOnTouchOutside(boolean canDismiss)
//显示dialog
showDialog(FragmentManager fragmentManager)
三.继承AppDialogFragment封装一个通用dialog---SyDialogFragment
3.1 SyDialogFragment特性
  1. 可设置dialog是否可点击返回键消失
  2. 可设置dialog是否可点击屏幕消失
  3. 当然是具备设置dialog大小的,但由于不想破坏其在app中统一性,于是固定大小了
  4. 可设置dialog背景色
  5. 可设置dialog标题栏的显示和隐藏
  6. 可设置dialog标题栏文字内容
  7. 可设置标题栏文字大小,颜色
  8. 可设置Content区文字内容
  9. 可设置Content区文字大小,颜色
  10. 可设置确认按钮的显示和隐藏
  11. 可设置确认按钮的文字内容,文字大小和文字颜色
  12. 可设置确认按钮的点击事件
  13. 可设置取消按钮的显示和隐藏
  14. 可设置取消按钮的文字内容,文字大小和文字颜色
  15. 可设置取消按钮的点击事件
3.2 SyDialogFragment的运用

在要使用的地方调用:

SyDialogFragment mSyDialogFragment=new SyDialogFragment();

mSyDialogFragment.setBackGroundColor(R.color.white)//默认背景白色,在SyDialogFragment中设置
                 .setTitle(true)//默认显示标题栏
                 .setTitleText("申请")//默认显示"提示",在xml中设置
                 .setTitleTextColor(R.color.blue)//默认黑色,在xml中设置
                 .setTitleTextSize(18f)//默认14sp,在xml中设置
                 .setMesssageText("你确定退出吗?")//默认显示"提示",在xml中设置
                 .setMesssageTextColor(R.color.black)//默认#666666,在xml中设置
                 .setMesssageTextSize(15f)//默认12sp,在xml中设置
                 .setCancelTextColor(R.color.color_1f1b24)//默认#68c81c,在xml中设置
                 .setCancelTextSize(16f)//默认14sp,在xml中设置
                 .setCancelBtn("cancel", new View.OnClickListener() {
                           @Override
                            public void onClick(View v) {//默认文字为“取消”,在xml中设置
                                ToastUtil.shortShow("取消");
                                mSyDialogFragment.dismiss();
                            }
                        })
                 .setConfirmTextColor(R.color.red)//默认#68c81c,在xml中设置
                 .setConfirmTextSize(16f)//默认14sp,在xml中设置
                 .setConfirmBtn("ok", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {//默认文字为“确定”,在xml中设置
                                ToastUtil.shortShow("确认");
                                mSyDialogFragment.dismiss();
                            }
                        })
                 .(false)//默认true
                 .setCancelOnTouchOutside(false)//默认true
                 .showDialog(getSupportFragmentManager());
3.3 SyDialogFragment使用注意事项
  1. setCancel(false)和setCancelOnTouchOutside(false)为SyDialogFragment父类方法,返回的是AppDialogFragment,所以SyDialogFragment在调用设置属性的时候,先调SyDialogFragment中的方法,最后设置setCancel,setCancelOnTouchOutside和showDialog
  2. SyDialogFragment默认不显示CancelBtn和ConfirmBtn,只有当你设置了setConfirmBtn方法后才会显示ConfirmBtn,CancelBtn同理
  3. 当只需要显示一个按钮的时候,不应该设置setConfirmBtn方法(避免布局错位),而应该设置setCancelBtn方法,并在setCancelBtn方法中去执行你的操作
四.自定义你的dialog

如果SyDialogFragment 仍无法满足你对dialog的需求,那么,你可以自定义自己的dialog

下面以自定义一个MyFragmentDialog来讲解下自定义dialog,继承AppDialogFragment写一个MyFragmentDialog,你可以类似这样:

package com.android.fr;

import android.view.View;
import android.widget.Button;

import com.android.base.ToastUtil;
import com.android.testdemo.R;

import butterknife.BindView;

/**
 * Title:
 * Description:
 * <p>
 * Created by pei
 * Date: 2018/4/16
 */
public class MyFragmentDialog extends AppDialogFragment{

    @BindView(R.id.btn_close)
    Button mBtnClose;

    @Override
    protected double[] getWindowSize() {
        return new double[]{0.5,0.5};
    }

    @Override
    protected int getLayoutId() {
        return R.layout.dialog_my_fragmnet;
    }

    @Override
    protected void initData() {

    }

    @Override
    protected void setListener() {
        mBtnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ToastUtil.showShortToast("dialog关闭");
                MyFragmentDialog.this.dismiss();
            }
        });
    }

}

这里需要解释的是 getWindowSize() 方法,return的是一个 double数组,数组中第一个0.5表示dialog宽度为全屏宽度的0.5,数组中第二个0.5表示dialog 高度为全屏高度的0.5

如果需要dialog默认大小,你的getWindowSize()可以 这样写:

    @Override
    protected double[] getWindowSize() {
        return new double[]{AppDialogFragment.WRAP_CONTENT,AppDialogFragment.WRAP_CONTENT};
    }

如果要dialog全屏,你的你的getWindowSize()可以 这样写:

@Override
protected double[] getWindowSize() {
        return new double[]{AppDialogFragment.MATCH_PARENT,AppDialogFragment.MATCH_PARENT};
    }

在使用时,你可以这样:

new MyFragmentDialog().setCancel(false)
                        .setCancelOnTouchOutside(false)
                        .showDialog(getSupportFragmentManager());

项目结构图和效果图

项目结构图

C063OfbbNNdYHjD4ISc.png

运行效果图

eZyUtJaPWeP5vNCOwuE.gif

自定义通用dialogFragment

代码地址如下:
http://www.demodashi.com/demo/12844.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值