自定義DialogFragment

需求效果:

因考慮在手機(jī)配置變化,導(dǎo)致Activity需要重新創(chuàng)建時(shí),例如旋屏,基于DialogFragment的對(duì)話框?qū)?huì)由FragmentManager自動(dòng)重建,然而基于Dialog實(shí)現(xiàn)的對(duì)話框則沒(méi)有這樣的能力,選擇DialogFragment來(lái)實(shí)現(xiàn)需求。官方文檔這樣形容DialogFragment:

一個(gè)顯示對(duì)話框窗口的片段,浮動(dòng)在其活動(dòng)窗口的頂部。這個(gè)片段包含一個(gè)對(duì)話框?qū)ο螅鶕?jù)片段的狀態(tài)進(jìn)行適當(dāng)?shù)娘@示。控制對(duì)話框(決定何時(shí)顯示、隱藏、關(guān)閉它)應(yīng)該通過(guò)這里的API完成,而不是直接調(diào)用對(duì)話框。

實(shí)現(xiàn)應(yīng)該覆蓋這個(gè)類并實(shí)現(xiàn)onCreateView(LayoutInflater、ViewGroup、Bundle)來(lái)提供對(duì)話框的內(nèi)容?;蛘?,它們可以覆蓋onCreateDialog(Bundle)來(lái)創(chuàng)建一個(gè)完全自定義的對(duì)話框,比如AlertDialog,它有自己的內(nèi)容。

即自定義DialogFragment時(shí),需要繼承DialogFragment;重寫(xiě)onCreateView()方法,初始化布局,(視要求是否需要去除title),在activity中調(diào)用就可以了

getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);//去除title布局

titlegetDialog().setCancelable(false);//取消

getDialog().setCanceledOnTouchOutside(false);//點(diǎn)擊外部不消失的方法

getDialog().getWindow().setBackgroundDrawableResource(R.drawable.bg_write_shape);//添加圓角背景


//Activity里面

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// FragmentTransaction transaction = getFragmentManager().beginTransaction();

// transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

new OneDialogFragment().show(getFragmentManager(),null);//getFragmentManager()可以用上面的transaction替換

}

其中show(FragmentManager,String)或者show(FragmentTransaction,String)來(lái)顯示DialogFragment;

布局如下:


運(yùn)行效果如下

看著特不順眼是不是。一步一步來(lái)

如何實(shí)現(xiàn)ui真正需求效果呢?

方法一:重寫(xiě)onActivityCreated;固定布局(可寫(xiě)死也可測(cè)量屏幕寬度來(lái))

@Overridepublic void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState);

WindowManager.LayoutParams attributes = getDialog().getWindow().getAttributes();

attributes.width = 800;

attributes.height = -2;

getDialog().getWindow().setAttributes(attributes);}

效果:


貌似已經(jīng)達(dá)到了效果;但是否還有其他方式樣式呢?繼續(xù)

方法二:重寫(xiě)onstart()方法(推薦)

如果覺(jué)得邊緣還是寬了,可以將0.8設(shè)置大點(diǎn)

@Overridepublic void onStart() {

super.onStart();

Dialog dialog =getDialog();

if(dialog != null){

DisplayMetrics displayMetrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); dialog.getWindow().setLayout((int) (displayMetrics.widthPixels *0.8),

ViewGroup.LayoutParams.WRAP_CONTENT); }}

效果是與上圖一樣的;

方法三:重寫(xiě)onStart()

@Overridepublic void onStart() {

getDialog().getWindow().getAttributes().width = (int) (getResources().getDisplayMetrics().widthPixels * 0.8);

getDialog().getWindow().setGravity(Gravity.CENTER);

super.onStart();}

另有比較靠邊緣一點(diǎn)的:重寫(xiě)oncreate()

@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setStyle(DialogFragment.STYLE_NO_TITLE,android.R.style.Theme_Holo_Light_Dialog_MinWidth);}

setStyle()方法需要在onCreateView()調(diào)用之前設(shè)置;如果覆寫(xiě)了onCreateDialog()方法后,就不能覆寫(xiě)onCreateView()方法了

效果如下

其中:setStyle(int ,int)方法的前參數(shù)有四周,上面引用的為去除標(biāo)題

STYLE_NORMAL:一個(gè)基本的,正常的對(duì)話框。

STYLE_NO_FRAME:不要畫(huà)任何框架;由onCreateView(LayoutInflater、ViewGroup、Bundle)返回的視圖層次結(jié)構(gòu)完全負(fù)責(zé)繪制對(duì)話框。(無(wú)框)

STYLE_NO_INPUT:與STYLE_NO_FRAME相似,但也禁用對(duì)話框中的所有輸入。(無(wú)法輸入內(nèi)容)

STYLE_NO_TITLE:不要包括標(biāo)題區(qū)。



后記:

1)更改title的顏色,大小等

TextView title = (TextView)getDialog().findViewById( android.R.id.title );

title.setTextColor(Color.parseColor("#333333"));

2)回退棧來(lái)保持fragment的狀態(tài)

如何添加一個(gè)Fragment事務(wù)到回退棧:FragmentTransaction.addToBackStack(String)


源碼分析參考鏈接:DialogFragment源碼分析及應(yīng)用實(shí)戰(zhàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.配置xml 首先要在最外層定義一個(gè)RetiveLayout布局(布局任意),然后在定義一個(gè)布局用來(lái)顯示內(nèi)容。 ...
    wangmf閱讀 4,620評(píng)論 2 8
  • 這里主要做的就是想讓你可以進(jìn)行各種Dialog的顯示功能,如果想要各種不同樣式的就可以進(jìn)行配置不同的文件設(shè)置...
    Charon_Pluto閱讀 2,761評(píng)論 0 7
  • 我為何要封裝DialogFragment 最近在重構(gòu)項(xiàng)目代碼,項(xiàng)目中創(chuàng)建對(duì)話框用的是Dialog,AlertDia...
    牛曉偉閱讀 37,541評(píng)論 52 181
  • 三生三世十里桃花火得不要不要的,野花菌頓時(shí)成了無(wú)數(shù)人心目中的最佳男友老公女婿候選人。但是,這枚天上地下獨(dú)一無(wú)二的癡...
    巨闕華光閱讀 263評(píng)論 0 0
  • 回顧一下前期的課程,我都是慢半拍的才開(kāi)始明白其中的內(nèi)容,一下子接受到了太多專業(yè)的東西,讓我有點(diǎn)難以消化,我真的不得...
    小耳xr閱讀 209評(píng)論 0 0

友情鏈接更多精彩內(nèi)容