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:
 * <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的創建就講到這里,謝謝

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375