前言
上篇我們對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());
四.看下簡單的效果圖吧
ok,今天關于默認dialogFragment的創建就講到這里,謝謝