DialogFragment(二)——创建默认dialogFragment

前言

上篇我们对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:
 * 

* 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());
四.看下简单的效果图吧
DialogFragment(二)——创建默认dialogFragment_第1张图片
1.gif

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

你可能感兴趣的:(DialogFragment(二)——创建默认dialogFragment)