zoukankan      html  css  js  c++  java
  • 自定义通用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());
    

    项目结构图和效果图

    项目结构图

    运行效果图

    自定义通用dialogFragment

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

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

  • 相关阅读:
    C# FTP操作
    SWUST OJ(963)
    插入排序(折半插入排序)
    SWUST OJ(962)
    SWUST OJ(961)
    SWUST OJ(960)
    SWUST OJ(957)
    SWUST OJ(956)
    SWUST OJ(955)
    SWUST OJ(954)
  • 原文地址:https://www.cnblogs.com/demodashi/p/9437252.html
Copyright © 2011-2022 走看看