前言
上篇我们对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());
四.看下简单的效果图吧
ok,今天关于默认dialogFragment的创建就讲到这里,谢谢