Android開發(fā)之通用Dialog

項(xiàng)目中或多或少都會用到Dialog,而大多的Dialog長得都差不多玄坦,最上面是一個title嫩挤,中間是具體content害幅,最后在下面一個取消,一個確定按鈕岂昭。當(dāng)然兩個按鈕的文字可能不一樣以现,但具體的含義都相差無幾。今天我們就來打造一個通用的Dialog,媽媽再也不用擔(dān)心我天天寫Dialog了邑遏。

我們這里用DialogFragment佣赖,為什么用這個呢?DialogFragment在android 3.0時被引入记盒,是官方推薦替代Dialog的憎蛤。使用DialogFragment來管理對話框,當(dāng)旋轉(zhuǎn)屏幕和按下后退鍵時可以更好的管理其聲明周期(fragment能夠感知Activity的生命周期)纪吮,它和Fragment有著基本一致的生命周期俩檬。

了解完基本情況,下面開始擼代碼碾盟。

@SuppressLint("ValidFragment")
public class CommonDialog extends DialogFragment{

    private int layout = -1;
    private TextView confirmTv, cancelTv, contentTv;
    private String confirm, cancel, content;

    public CommonDialog(int layout) {
        setStyle(STYLE_NO_FRAME, R.style.common_dialog_style);
        this.layout = layout;
    }

    public CommonDialog() {
        setStyle(STYLE_NO_FRAME, R.style.common_dialog_style);
    }
    public CommonDialog(int layout,int style) {
        setStyle(STYLE_NO_FRAME, style);
        this.layout = layout;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View mView = inflater.inflate(layout == -1 ? R.layout.dialog_common : layout, container, false);
        confirmTv = mView.findViewById(R.id.confirm);
        cancelTv = mView.findViewById(R.id.cancel);
        contentTv = mView.findViewById(R.id.content);

        if (this.cancel != null){
            cancelTv.setText(cancel);
        }
        if (this.confirm != null){
            confirmTv.setText(confirm);
        }
        if (this.content != null){
            contentTv.setText(content);
        }
        if(confirmTv != null) {
            confirmTv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    hide();
                    if(mOnCertainButtonClickListener != null){
                        mOnCertainButtonClickListener.onCertainButtonClick();
                    }
                }
            });
        }
        if(cancelTv != null) {
            cancelTv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    hide();
                    if (mOnCancelClickListener != null){
                        mOnCancelClickListener.onCancelClick();
                    }
                }
            });
        }
        return mView;
    }

    public interface OnCertainButtonClickListener {
        void onCertainButtonClick();
    }
    public interface onCancelClickListener{
        void onCancelClick();
    }
    private OnCertainButtonClickListener mOnCertainButtonClickListener;
    private onCancelClickListener mOnCancelClickListener;

    public CommonDialog setOnCancelClickListener(onCancelClickListener listener){
        mOnCancelClickListener = listener;
        return this;
    }
    public CommonDialog setOnCertainButtonClickListener(OnCertainButtonClickListener listener) {
        mOnCertainButtonClickListener = listener;
        return  this;
    }

    public CommonDialog setConfirm(String confirm) {
        this.confirm = confirm;
        return this;
    }

    public CommonDialog setCancel(String cancel) {
        this.cancel = cancel;
        return this;
    }

    public CommonDialog setContent(String content) {
        this.content = content;
        return this;
    }

    public CommonDialog setDailogCancelable(boolean isCancel){
        this.setCancelable(isCancel);
        return this;
    }
}

代碼較長棚辽,但是非常簡單,大都是一些設(shè)置冰肴。我們這里講一下主要的方法屈藐。從構(gòu)造器開始,可以看到熙尉,這里提供了3個構(gòu)造器联逻,但都有一行代碼:
setStyle(STYLE_NORMAL, R.style.common_dialog_style);
是DialogFragment提供給我們用來設(shè)置樣式的。里面有2個參數(shù)骡尽。第一個參數(shù)是設(shè)置格式遣妥,官方聲明了四個int類型的靜態(tài)常量,代表彈窗的四種格式攀细。具體如下所示:

1.STYLE_NORMAL:這個就是基礎(chǔ)的箫踩、正常的dialog
2.STYLE_NO_TITLE:無標(biāo)題欄的dialog
3.STYLE_NO_FRAME:無邊框的dialog,這個風(fēng)格適合在onCreateView返回view是使用谭贪。
4.STYLE_NO_INPUT:跟第三個一樣境钟,此外,他沒有輸入框俭识,沒有點(diǎn)擊事件慨削,也不能獲取到輸入焦點(diǎn)。

第二個參數(shù)就是我們自己寫的style樣式了套媚。具體的含義我在注釋里面寫了:

<style name="common_dialog_style" parent="@android:style/Theme.Dialog">
        <!-- 無邊框設(shè)置 -->  
        <item name="android:windowFrame">@null</item>
         <!-- 是否浮現(xiàn)在activity之上 -->  
        <item name="android:windowIsFloating">true</item>
        <!-- 是否半透明 -->  
        <item name="android:windowIsTranslucent">false</item>
        <!-- 是否沒有標(biāo)題 -->  
        <item name="android:windowNoTitle">true</item>
         <!-- 背景 -->  
        <item name="android:windowBackground">@drawable/dialog_bg</item>
        <!-- 是否背景模糊 -->  
        <item name="android:backgroundDimEnabled">true</item>
        <!--dialog遮罩透明度-->
        <item name="android:backgroundDimAmount">0.5</item>
    </style>

此外缚态,還有很多配置,比如進(jìn)出動畫堤瘤、點(diǎn)擊外部是否消失玫芦、鍵盤輸入等,這里就不一一介紹了本辐,感興趣的讀者可以自行閱讀源碼桥帆。

仔細(xì)的朋友可能看到了医增,有個int類型的layout = -1,他的作用是某些dialog有些特殊老虫,他長得跟通用dialog有些出入叶骨。針對這種情況,我們需要調(diào)用帶有l(wèi)ayout參數(shù)的構(gòu)造函數(shù)祈匙,在inflate的時候會判斷忽刽,如果layout == -1,我們會用通用的xml布局菊卷,反之我們會調(diào)用傳入的xml缔恳。這里需要的注意的是,傳入的layout洁闰,里面必須有跟默認(rèn)layout一樣的textview的id,否則會報(bào)錯万细。這也是一種限制吧扑眉,如果各位有更好的解決辦法,煩請告知赖钞。接著就是判斷有無傳進(jìn)來具體的按鈕和彈窗內(nèi)容的文字腰素。最后就是為取消、確定兩個按鈕設(shè)置監(jiān)聽雪营,點(diǎn)擊的時候先讓dialog消失弓千,然后通過接口將具體的處理交給實(shí)現(xiàn)者。接下來的代碼就是一些dialog的配置献起,采用鏈?zhǔn)降姆绞窖蠓茫彩趾唵巍?/p>

我們來看一下調(diào)用:

      commonDialog = new CommonDialog()
                .setDailogCancelable(false)
                .setCancel("不開心")
                .setConfirm("就這樣")
                .setContent("你彈出了一個彈窗,開心不谴餐?")
                .setOnCertainButtonClickListener(new CommonDialog.OnCertainButtonClickListener() {
                    @Override
                    public void onCertainButtonClick() {
                        Toast.makeText(mContext, "確定", Toast.LENGTH_SHORT).show();
                    }
                })
                .setOnCancelClickListener(new CommonDialog.onCancelClickListener() {
                    @Override
                    public void onCancelClick() {
                        Toast.makeText(mContext, "取消", Toast.LENGTH_SHORT).show();
                    }
                });

        commonDialog.show(getFragmentManager(), "CommonDialog");

另外兩種構(gòu)造就不演示了姻政,只需在new出對象的時候傳入相應(yīng)的布局文件和style即可。最后我們來看一下效果圖:


dialog.jpeg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岂嗓,一起剝皮案震驚了整個濱河市汁展,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厌殉,老刑警劉巖食绿,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異公罕,居然都是意外死亡器紧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門熏兄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來品洛,“玉大人树姨,你說我怎么就攤上這事∏抛矗” “怎么了帽揪?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辅斟。 經(jīng)常有香客問我转晰,道長,這世上最難降的妖魔是什么士飒? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任查邢,我火速辦了婚禮,結(jié)果婚禮上酵幕,老公的妹妹穿的比我還像新娘扰藕。我一直安慰自己,他們只是感情好芳撒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布邓深。 她就那樣靜靜地躺著,像睡著了一般笔刹。 火紅的嫁衣襯著肌膚如雪芥备。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天舌菜,我揣著相機(jī)與錄音萌壳,去河邊找鬼。 笑死日月,一個胖子當(dāng)著我的面吹牛袱瓮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播山孔,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼懂讯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了台颠?” 一聲冷哼從身側(cè)響起褐望,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎串前,沒想到半個月后瘫里,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荡碾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年谨读,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坛吁。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡劳殖,死狀恐怖铐尚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哆姻,我是刑警寧澤宣增,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站矛缨,受9級特大地震影響爹脾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜箕昭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一灵妨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧落竹,春花似錦泌霍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桨武,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锈津,已是汗流浹背呀酸。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琼梆,地道東北人性誉。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像茎杂,于是被迫代替她去往敵國和親错览。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345