美文网首页Android开发经验谈Android开发Android知识
DialogFragment(二)——创建默认dialogFra

DialogFragment(二)——创建默认dialogFra

作者: 奔跑的佩恩 | 来源:发表于2017-12-13 16:59 被阅读1110次

    前言

    上篇我们对dialogFragment做了一个简单的介绍,
    DialogFragment(一)——简介
    这篇文章,我们来讲讲默认dialogFragment的创建和使用
    讲解重点

    • AppCompatActivity 和 DialogFragment 去掉“标题栏”的问题
    • 创建默认dialogFragment
    • 默认dialogFragment 的使用
    一.AppCompatActivity 和 DialogFragment 去掉“标题栏”的问题

    这里描述下为什么要讲这个问题,因为我在写自定义dialogFragment的demo的时候,发现dialogFragment中的控件并未按布局中显示在最上面,而是与顶端有一段距离,于是想到是不是title再作怪,就查了下相关资料,确实是标题栏的问题,于是就涉及到标题栏隐藏的问题。
    在Activity时期,Fragment标题栏的隐藏是这么处理的:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState)
           //去掉标题栏(需要在setContentView之前调用)
          this.requestWindowFeature(Window.FEATURE_NO_TITLE);
           //加载layout
           setContentView(R.layout.activity_main);
          //执行逻辑代码
          //......
    }
    

    但是在现在的项目中我们的BaseActivty都是继承 AppCompatActivity 的,AppCompatActivity的继承链如下:

    AppCompatActivity--->FragmentActivity
    

    FragmentActivity和Activity是两个不同的类,另外,在activity中有标题栏,然而在AppCompatActivity中是没有标题栏的,只有ActionBar,所以以前的

        //去掉标题栏(需要在setContentView之前调用)
          this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    

    用到现的AppCompatActivity中是没有效果的

    但是我们可以在我们的BaseActivity中写下去掉标题栏的兼容性代码,示例如下:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mContext = this;
            AppActivityManager.getInstance().addActivity(this);
              //去掉标题栏(需要在setContentView之前调用)
              if(mContext instanceof AppCompatActivity){
                  if (getSupportActionBar() != null){
                      getSupportActionBar().hide();
                  }
              }else if(mContext instanceof Activity){
                  this.requestWindowFeature(Window.FEATURE_NO_TITLE);
              }
            //加载layout
            if (getContentViewId() != 0) {
                mLayoutView = LayoutInflater.from(mContext).inflate(getContentViewId(), null);
                setContentView(mLayoutView);
                mUnbinder = ButterKnife.bind(this);
            }
    
            initData();
            setListener();
        }
    

    虽然以上方法对去掉项目中activity中的标题栏起作用,但是对于DialogFragment确是不起作用的,于是我去标题栏的最终办法是用我之前的那篇文中解决的,android去掉系统默认标题栏,具体的我就不再赘述了。

    二.创建默认dialogFragment

    这里我是写一个DefaultDialogFragment去继承AppCompatDialogFragment实现的,当然,是要重写onCreateDialog方法的,具体代码如下:

    package com.dialogfragmentdemo.widget.dialog;
    
    import android.app.Dialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.support.v4.app.FragmentManager;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatDialogFragment;
    import android.view.KeyEvent;
    
    import com.dialogfragmentdemo.base.AppDialogFragment;
    import com.dialogfragmentdemo.util.LogUtil;
    import com.dialogfragmentdemo.util.StringUtil;
    
    /**
     * Title:设置默认DefaultDialogFragment
     * Description:
     * <p>
     * Created by pei
     * Date: 2017/12/7
     */
    public class DefaultDialogFragment extends AppCompatDialogFragment {
    
        private Context mContext;
        private String mTitle;
        private String message;
        private String mPositiveText;
        private String mNegativeText;
        private int mBgGround;
        private boolean mBackCancel = true;//默认点击返回键关闭dialog
        private boolean mTouchOutsideCancel = true;//默认点击dialog外面屏幕,dialog关闭
        private DialogInterface.OnClickListener mPositiveOnClickListener;
        private DialogInterface.OnClickListener mNegativeOnClickListener;
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            this.mContext = context;
        }
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
    //        AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AlertDialog);
            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
            //设置标题
            if (StringUtil.isNotEmpty(mTitle)){
                builder.setTitle(mTitle);
            }
            //设置提示语
            if (StringUtil.isNotEmpty(message)) {
                builder.setMessage(message);
            }
            builder.setTitle(mTitle)
                    .setMessage(message)//getResources().getString(R.string.hello_world)
                    //设置返回键
                    .setOnKeyListener(new KeyBackListener());
            //设置确定按钮
            if (null != mPositiveText) {
                builder.setPositiveButton(mPositiveText, mPositiveOnClickListener);
            }
            //设置否定按钮
            if (null != mNegativeText) {
                builder.setNegativeButton(mNegativeText, mNegativeOnClickListener);
            }
            AlertDialog dialog=builder.create();
            //设置屏幕外部点击是否可以取消
            dialog.setCanceledOnTouchOutside(mTouchOutsideCancel);
            //设置dialog背景色
            if(mBgGround!=0){
                dialog.getWindow().setBackgroundDrawable(mContext.getResources().getDrawable(mBgGround));
            }
            return dialog;
        }
    
        /**监听返回键的类**/
        class KeyBackListener implements DialogInterface.OnKeyListener{
            @Override
            public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    return !mBackCancel;
                }
                return false;
            }
        }
    
        /**
         * 设置标题
         **/
        public DefaultDialogFragment setTitle(String title) {
            this.mTitle = title;
            return this;
        }
    
        /**
         * 设置信息
         **/
        public DefaultDialogFragment setMessage(String message) {
            this.message = message;
            return this;
        }
    
        /**
         * 设置点击返回键是否关闭dialog
         **/
        public DefaultDialogFragment setCancel(boolean canDismiss) {
            this.mBackCancel = canDismiss;
            return this;
        }
    
        /**
         * 设置点击屏幕外面是否关闭dialog
         **/
        public DefaultDialogFragment setCancelOnTouchOutside(boolean canDismiss) {
            this.mTouchOutsideCancel = canDismiss;
            return this;
        }
    
        /**设置dialog背景**/
        public DefaultDialogFragment setBackGround(int rid){
            mBgGround=rid;
            return this;
        }
    
        /**
         * 设置Positive点击事件
         **/
        public DefaultDialogFragment setPositiveListener(String positiveText, DialogInterface.OnClickListener onClickListener) {
            this.mPositiveText = positiveText;
            this.mPositiveOnClickListener = onClickListener;
            return this;
        }
    
        /**
         * 设置Negative点击事件
         **/
        public DefaultDialogFragment setNegativeListener(String negativeText, DialogInterface.OnClickListener onClickListener) {
            this.mNegativeText = negativeText;
            this.mNegativeOnClickListener = onClickListener;
            return this;
        }
    
        /***
         * 显示dialog,需要传 fragmentManager=getSupportFragmentManager()
         * @param fragmentManager
         */
        public void showDialog(FragmentManager fragmentManager) {
            try {
                String className = this.getClass().getSimpleName();
                this.show(fragmentManager, className);
            } catch (Exception e) {
                e.printStackTrace();
                LogUtil.e(AppDialogFragment.class, "===showDialog error====" + e.getMessage());
            }
        }
    
    }
    
    
    //===============调用范例==========
    //                new DefaultDialogFragment()
    //                        //设置标题
    //                        .setTitle("你是谁")
    //                        //设置内容
    //                        .setMessage("who are you")
    //                        //禁用返回键
    //                        .setCancel(false)
    //                        //禁止屏幕外部点击消失
    //                        .setCancelOnTouchOutside(false)
    //                        //设置背景色
    //                        .setBackGround(R.color.blue)
    //                        //取消事件
    //                        .setNegativeListener("不好",new DialogInterface.OnClickListener(){
    //@Override
    //public void onClick(DialogInterface dialogInterface,int i){
    //        ToastUtil.shortShow("heihei");
    //        }
    //        })
    //        //确认事件
    //        .setPositiveListener("ok",new DialogInterface.OnClickListener(){
    //@Override
    //public void onClick(DialogInterface dialogInterface,int i){
    //        ToastUtil.shortShow("haha");
    //        }
    //        })
    //        //显示dialog
    //        .showDialog(getSupportFragmentManager());
    
    三.默认dialogFragment 的使用

    看下在mainActivity中是调用范例吧:

                    new DefaultDialogFragment()
                            //设置标题
                            .setTitle("你是谁")
                            //设置内容
                            .setMessage("who are you")
                            //禁用返回键
                            .setCancel(false)
                            //禁止屏幕外部点击消失
                            .setCancelOnTouchOutside(false)
                            //设置背景色
                            .setBackGround(R.color.blue)
                            //取消事件
                            .setNegativeListener("不好", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    ToastUtil.shortShow("heihei");
                                }
                            })
                            //确认事件
                            .setPositiveListener("ok", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    ToastUtil.shortShow("haha");
                                }
                            })
                            //显示dialog
                            .showDialog(getSupportFragmentManager());
    
    四.看下简单的效果图吧
    1.gif

    ok,今天关于默认dialogFragment的创建就讲到这里,谢谢

    相关文章

      网友评论

        本文标题:DialogFragment(二)——创建默认dialogFra

        本文链接:https://www.haomeiwen.com/subject/ldczixtx.html