DialogFragment最大的好处就是当横竖屏切换的时候不会消失,一般使用的时候是创建一个dialogfragment,然后继承DialogFragment类。调用也很简单。要注意一点的是DialogFragment是v4包下边的,所以如果创建dialogfragment的时候记得继承的是v4包下边的DialogFragment,创建FragmentManager的时候也是调用v4包下边的getSupportFragmentManager()方法。
OneDialogFragment fragment=new OneDialogFragment(); FragmentManager fragmentManager = getSupportFragmentManager(); fragment.show(fragmentManager, "show_dialog");
一、基本对话框
DialogFragment可以使用基本的对话框,实现过程是在onCreateDialog()方法中定义对话框。
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog dialog = new AlertDialog.Builder(getActivity()) .setTitle("对话框") .setMessage("这是一个普通对话框") .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getActivity(), "点击了取消按钮", Toast.LENGTH_LONG).show(); dialog.dismiss(); } }) .create(); dialog.setCancelable(true); dialog.setCanceledOnTouchOutside(true); return dialog; }
二、创建简单的自定义对话框
实现过程也很简单,只需要在onCreateView()方法中创建布局即可。
@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_dialog_two, container); et_name = (EditText) view.findViewById(R.id.et_name); et_school = (EditText) view.findViewById(R.id.et_school); btn_confirm = (Button) view.findViewById(R.id.btn_confirm); return view; }
三、创建自定义对话框并设置样式
设置Dialog的样式,只需要在styles.xml文件中定义样式并调用即可。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialogShowTypeOne); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_dialog_three, container); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getDialog().setCancelable(true); getDialog().setCanceledOnTouchOutside(true); //设置对话框的显示位置及大小 WindowManager.LayoutParams attributes = getDialog().getWindow().getAttributes(); attributes.gravity = Gravity.BOTTOM; attributes.width = 600; attributes.height = 500; getDialog().getWindow().setAttributes(attributes); }
style文件:
<style name="CustomDialogShowTypeOne" parent="AlertDialog.AppCompat.Light"> <!--设置背景透明--> <item name="android:windowBackground">@color/color_transparent</item> <!--背景是否透明--> <item name="android:windowIsTranslucent">false</item> <!--是否没有标题--> <item name="android:windowNoTitle">true</item> <!--是否浮在window上--> <item name="android:windowIsFloating">true</item> <!--是否背景模糊--> <item name="android:backgroundDimEnabled">true</item> <!--设置背景模糊的透明度--> <item name="android:backgroundDimAmount">0.6</item> </style>
四、创建自定义对话框并设置动画
创建动画文件并调用即可。
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialogShowTypeTwo); }
style文件:
<style name="CustomDialogShowTypeTwo" parent="CustomDialogShowTypeOne"> <item name="android:windowAnimationStyle">@style/CustomDialogAnimType</item> </style> <style name="CustomDialogAnimType" parent="AlertDialog.AppCompat.Light"> <item name="android:windowEnterAnimation">@anim/anim_dialog_enter</item> <item name="android:windowExitAnimation">@anim/anim_dialog_exit</item> </style>
anim_dialog_enter:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="800"> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" /> <translate android:fromYDelta="100%p" android:toYDelta="0" /> </set>
anim_dialog_exit:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="800"> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" /> <translate android:fromYDelta="0" android:toYDelta="100%p" /> </set>
五、创建自定义对话并设置一些监听
常用的监听有OnCancelListener、OnDismissListener,在dialogfragment中实现这些接口并实现他们的方法即可。
public class FiveDialogFragment extends DialogFragment implements DialogInterface.OnCancelListener,DialogInterface.OnDismissListener
@Override public void onCancel(DialogInterface dialog) { super.onCancel(dialog); Log.i("ruxing","取消了"); } @Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); Log.i("ruxing","消失了"); }
对应github地址:https://github.com/ruxing1102/DialogFragmentDemo