Android DialogFragment 使用

簡介

項(xiàng)目里一直使用dialog松邪,最近才發(fā)現(xiàn)谷歌早就推出了DialogFragment晋被,由于平常寫項(xiàng)目需求基本也都是繼承dialog重寫违寞,發(fā)現(xiàn)使用DialogFragment更加方便圆存,也是谷歌推薦替換的玉掸,所以來學(xué)習(xí)一下DialogFragment的用法店归。

DialogFragment的基本使用

使用一個DialogFragment一般我們需要重新寫一個類來繼承DialogFragment阎抒,DialogFragment原本其實(shí)也是一個fragment,只是其內(nèi)部綁定了dialog消痛,所以很多操作是差不多的且叁。
創(chuàng)建一個DialogFragment有兩個方法,一個是我們比較熟悉的秩伞,重新onCreateDialog方法逞带, 返回一個創(chuàng)建的dialog對象就行,具體如下:

public class MyDialogFragment extends DialogFragment{

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
       AlertDialog dialog =  new AlertDialog.Builder(getActivity())
               .setTitle("神燈")
               .setMessage("來選擇你要實(shí)現(xiàn)的一個愿望把")
               .setPositiveButton("車子", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {

                   }
               })
               .setNegativeButton("房子", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {

                   }
               }).create();
        return dialog;

    }

    public class MainActivity extends AppCompatActivity {
    MyDialogFragment dialogFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dialogFragment = new MyDialogFragment();
        dialogFragment.show(getSupportFragmentManager(),"dialog");
    }
}

一個簡單的DialogFragment就完成了:

QQ圖片20190103182913.png

另一種就是通過onCreateView來返回一個自己寫好的view來完成纱新,默認(rèn)會在居中顯示

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_my_test,null);
        return view;
    }

這就是另一種最簡單的方式展氓,具體其實(shí)跟fragment的使用方法一樣。

其中的回調(diào)部分怒炸,也是自己定義一個接口带饱,然后在對應(yīng)的點(diǎn)擊事件里面做處理就可以了:

 AlertDialog.Builder builder =  new AlertDialog.Builder(getContext())
                .setTitle("選擇頭像")
                .setPositiveButton("相冊", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if(callback!=null){
                            callback.onPhoto();
                        }
                    }
                })
                .setNegativeButton("相機(jī)", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if(callback!=null){
                            callback.onCamera();
                        }
                    }
                });
        return builder.create();

    private Callback callback;


    public  interface Callback{
        void onPhoto();
        void onCamera();
    }


    public void setCallback(Callback callback) {
        this.callback = callback;
    }
//使用的地方
SelectPhotoFragment selectPhotoFragment = new SelectPhotoFragment();
        selectPhotoFragment.show(getSupportFragmentManager(), "photo");
        selectPhotoFragment.setCallback(new SelectPhotoFragment.Callback() {
            @Override
            public void onPhoto() {
                openCreame();
            }

            @Override
            public void onCamera() {

            }
        });

這些就是DialogFragment的基本使用,下面說一些在項(xiàng)目的過程中碰到的問題,或者注意的地方勺疼。

相信很多人在用dialog的時候教寂,有時候需要dialog的左右全屏填充滿,有如下的幾種方式可以實(shí)現(xiàn):

在5.0以上的版本中执庐,我們在style中可以查看默認(rèn)的dialog風(fēng)格酪耕,其實(shí)有設(shè)置dialog的一些屬性,自己定義一種類型的dialog轨淌,然后繼承就可以修改整體dialog中的風(fēng)格了迂烁,默認(rèn)動畫,背景顏色递鹉,或者寬度之類的都是可以的如下:

 <style name="MyMinDialogWidth" parent="Base.Theme.AppCompat.Dialog">
        <item name="android:windowMinWidthMajor">100%</item>
        <item name="android:windowMinWidthMinor">100%</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

   <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
   
        <item name="android:alertDialogTheme">@style/MyMinDialogWidth</item>
        <item name="android:dialogTheme">@style/MyMinDialogWidth</item>
    </style>
//Theme.AppCompat.Dialog主題常用的一般有以下屬性:

<!-- 背景透明 -->  

<item name="android:windowBackground">@android:color/transparent</item>  

<!-- 邊框 -->  

<item name="android:windowFrame">@null</item>  

<!-- 是否浮現(xiàn)在activity之上 -->  

<item name="android:windowIsFloating">true</item>  

<!-- 是否半透明 -->  

<item name="android:windowIsTranslucent">true</item>  

<!-- 是否無標(biāo)題 -->  

<item name="android:windowNoTitle">true</item>  

<!-- Dialog背景樣式 --> 

<item name="android:background">@android:color/transparent</item>  

<!-- 模糊 -->  

<item name="android:backgroundDimEnabled">true</item>  

<!-- 遮罩層 -->  

<item name="android:backgroundDimAmount">0.5</item> 

這樣我們就可以自由的操作布局控件盟步,設(shè)置大小了□锝幔或者繼承一個dialog在代碼中設(shè)置

//給dialog設(shè)置彈出動畫
getWindow().setWindowAnimations(R.style.dialog_animtion_style);
//設(shè)置dialog的大小
  WindowManager.LayoutParams lp=getWindow().getAttributes();
        lp.width=WindowManager.LayoutParams.MATCH_PARENT;
        lp.height=WindowManager.LayoutParams.WRAP_CONTENT;
        /*lp.gravity= Gravity.BOTTOM;*/
        getWindow().setAttributes(lp);

其實(shí)由于dialog的默認(rèn)效果是在中間顯示却盘,有時候我們需要讓他顯示在頂部或者底部,上面代碼注釋掉的地方可以修改gravity來達(dá)到效果媳拴。
有時候需要設(shè)置dialog的彈出和退出時候的動畫黄橘,其實(shí)也是在style中設(shè)置一下就行,這樣就可以定義自己想要實(shí)現(xiàn)的效果

 <style name="dialog_animtion_style">
        <item name="android:windowEnterAnimation">@anim/dialog_show_anim</item>
        <item name="android:windowExitAnimation">@anim/dialog_miss_anim</item>
    </style>

dialog的大致用法就是如此了屈溉,這個控件其實(shí)跟PopupWindow 挺像的塞关,但是PopupWindow 會更麻煩一點(diǎn),坑也會多一點(diǎn)子巾,默認(rèn)不會有一層黑色覆蓋層帆赢,點(diǎn)擊外部也不會消失。所以如果沒有對位置太高的要求砰左,推薦使用DialogFragment

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匿醒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缠导,更是在濱河造成了極大的恐慌,老刑警劉巖溉痢,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僻造,死亡現(xiàn)場離奇詭異,居然都是意外死亡孩饼,警方通過查閱死者的電腦和手機(jī)髓削,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镀娶,“玉大人立膛,你說我怎么就攤上這事。” “怎么了宝泵?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵好啰,是天一觀的道長。 經(jīng)常有香客問我儿奶,道長框往,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任闯捎,我火速辦了婚禮椰弊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓤鼻。我一直安慰自己秉版,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布茬祷。 她就那樣靜靜地躺著清焕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牲迫。 梳的紋絲不亂的頭發(fā)上耐朴,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音盹憎,去河邊找鬼筛峭。 笑死,一個胖子當(dāng)著我的面吹牛陪每,可吹牛的內(nèi)容都是我干的影晓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼檩禾,長吁一口氣:“原來是場噩夢啊……” “哼挂签!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盼产,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饵婆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戏售,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侨核,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年灌灾,在試婚紗的時候發(fā)現(xiàn)自己被綠了搓译。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡锋喜,死狀恐怖些己,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤段标,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布涯冠,位于F島的核電站,受9級特大地震影響怀樟,放射性物質(zhì)發(fā)生泄漏功偿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一往堡、第九天 我趴在偏房一處隱蔽的房頂上張望械荷。 院中可真熱鬧,春花似錦虑灰、人聲如沸吨瞎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颤诀。三九已至,卻和暖如春对湃,著一層夾襖步出監(jiān)牢的瞬間崖叫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工拍柒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留心傀,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓拆讯,卻偏偏與公主長得像脂男,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子种呐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348