問(wèn)題的由來(lái)
最近在優(yōu)化項(xiàng)目代碼時(shí)征炼,項(xiàng)目中創(chuàng)建對(duì)話框一般使用的是Dialog析既,AlertDialog。
但是當(dāng)Dialog中View界面復(fù)雜谆奥、邏輯復(fù)雜時(shí)眼坏,導(dǎo)致當(dāng)前頁(yè)面既要寫自己的頁(yè)面邏輯,還要寫Dialog中的邏輯雄右。
官方推出了DialogFragment來(lái)代替Dialog空骚,那我就去了解了下DialogFragment的使用。
DialogFragment的優(yōu)點(diǎn)
- DialogFragment說(shuō)到底還是一個(gè)Fragment擂仍,因此它繼承了Fragment的所有特性囤屹。
同理FragmentManager會(huì)管理DialogFragment。 - 可以在屏幕旋轉(zhuǎn)或按下返回鍵可以更好的處理其生命周期逢渔。
- 在手機(jī)配置發(fā)生變化的時(shí)候肋坚,F(xiàn)ragmentManager可以負(fù)責(zé)現(xiàn)場(chǎng)的恢復(fù)工作。
調(diào)用DialogFragment的setArguments(bundle)方法進(jìn)行數(shù)據(jù)的設(shè)置肃廓,可以保證DialogFragment的數(shù)據(jù)也能恢復(fù)智厌。 - DialogFragment里的onCreateView和onCreateDIalog 2個(gè)方法,onCreateView可以用來(lái)創(chuàng)建自定義Dialog盲赊,onCreateDIalog 可以用Dialog來(lái)創(chuàng)建系統(tǒng)原生Dialog铣鹏。可以在一個(gè)類中管理2種不同的dialog哀蘑。
DialogFragment使用
1. 創(chuàng)建DialogFragment
DialogFragment至少需要實(shí)現(xiàn)onCreateView或者onCreateDIalog方法中的一個(gè)诚卸。
- 重寫onCreateView()方法,可以用來(lái)創(chuàng)建自定義Dialog
public class MyDialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
View view = inflater.inflate(R.layout.fragment_dialog, container);
return view;
}
}
- 重寫onCreateDialog()方法绘迁,創(chuàng)建系統(tǒng)原生Dialog
public class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext(),R.style.theme);
builder.setTitle("對(duì)話框");
View view = inflater.inflate(R.layout.fragment_dialog, container);
builder.setView(view);
builder.setPositiveButton("確定", null);
builder.setNegativeButton("取消", null);
return builder.create();
}
}
2. 調(diào)用方式
MyDialogFragment fragment= new MyDialogFragment ();
fragment.show(getFragmentManager(), "MyDialogment");
關(guān)于fragment和activity之間進(jìn)行通信可以使用接口回調(diào)的方式
DialogFragment的擴(kuò)展
-
設(shè)置寬高和對(duì)話框背景等
在xml中設(shè)置和onCreateView(), onViewCreated()中設(shè)置無(wú)效. 在onStart()和onResume()中設(shè)置才有效.
@Override
public void onStart() { //在onStart()中
super.onStart();
getDialog().getWindow().setBackgroundDrawableResource(R.drawable.background); //對(duì)話框背景
getDialog().getWindow().setLayout(300,200); //寬高
}
- 向DialogFragment傳遞參數(shù)
public static MyDialogFragment newInstance(int num) {
MyDialogFragment f = new MyDialogFragment();
// Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);
return f;
}