需求效果:
因考慮在手機(jī)配置變化儡率,導(dǎo)致Activity需要重新創(chuàng)建時(shí)或杠,例如旋屏融蹂,基于DialogFragment的對(duì)話框?qū)?huì)由FragmentManager自動(dòng)重建然走,然而基于Dialog實(shí)現(xiàn)的對(duì)話框則沒有這樣的能力悍赢,選擇DialogFragment來實(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)該通過這里的API完成,而不是直接調(diào)用對(duì)話框烹笔。
實(shí)現(xiàn)應(yīng)該覆蓋這個(gè)類并實(shí)現(xiàn)onCreateView(LayoutInflater裳扯、ViewGroup、Bundle)來提供對(duì)話框的內(nèi)容谤职∈尾颍或者,它們可以覆蓋onCreateDialog(Bundle)來創(chuàng)建一個(gè)完全自定義的對(duì)話框允蜈,比如AlertDialog冤吨,它有自己的內(nèi)容。
即自定義DialogFragment時(shí)饶套,需要繼承DialogFragment;重寫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)來顯示DialogFragment;
布局如下:
運(yùn)行效果如下
看著特不順眼是不是怠李。一步一步來
如何實(shí)現(xiàn)ui真正需求效果呢?
方法一:重寫onActivityCreated蛤克;固定布局(可寫死也可測(cè)量屏幕寬度來)
@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ù)
方法二:重寫onstart()方法(推薦)
如果覺得邊緣還是寬了构挤,可以將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); }}
效果是與上圖一樣的髓介;
方法三:重寫onStart()
@Overridepublic void onStart() {
getDialog().getWindow().getAttributes().width = (int) (getResources().getDisplayMetrics().widthPixels * 0.8);
getDialog().getWindow().setGravity(Gravity.CENTER);
super.onStart();}
另有比較靠邊緣一點(diǎn)的:重寫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è)置;如果覆寫了onCreateDialog()方法后儿倒,就不能覆寫onCreateView()方法了
效果如下
其中:setStyle(int ,int)方法的前參數(shù)有四周版保,上面引用的為去除標(biāo)題
STYLE_NORMAL:一個(gè)基本的,正常的對(duì)話框呜笑。
STYLE_NO_FRAME:不要畫任何框架;由onCreateView(LayoutInflater夫否、ViewGroup、Bundle)返回的視圖層次結(jié)構(gòu)完全負(fù)責(zé)繪制對(duì)話框叫胁。(無框)
STYLE_NO_INPUT:與STYLE_NO_FRAME相似凰慈,但也禁用對(duì)話框中的所有輸入。(無法輸入內(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)回退棧來保持fragment的狀態(tài)
如何添加一個(gè)Fragment事務(wù)到回退棧:FragmentTransaction.addToBackStack(String)