DialogFragment使用总结

        最近使用dialog的情况比较多,谷歌现在开始建议使用Dialogfragment 来代替传统的dialog,至于dialogfragment 的好处大家可以百度一下,于是乎要转变思路开始使用最新的dialogfragment,不过使用过程不是很顺利,各种坑,所以今天索性把基本上所有情况都整理了一下,上代码吧还是

       1.最基本的一个普通的dialog

[java] view plain copy
  1. public static class NormalFragmentDialog extends DialogFragment {  
  2.     public static NormalFragmentDialog getInstance() {  
  3.         NormalFragmentDialog normalFragmentDialog = new NormalFragmentDialog();  
  4.         return normalFragmentDialog;  
  5.     }  
  6.   
  7.     @Override  
  8.     public Dialog onCreateDialog(Bundle savedInstanceState) {  
  9.         AlertDialog alertDialog = new AlertDialog.Builder(getActivity())  
  10.                 .setTitle("普通的DIALOG")  
  11.                 .setMessage("这是一个普通的dialog")  
  12.                 .setNegativeButton(R.string.cancle, new DialogInterface.OnClickListener() {  
  13.                     @Override  
  14.                     public void onClick(DialogInterface dialog, int which) {  
  15.                         dialog.dismiss();  
  16.                     }  
  17.                 })  
  18.                 .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {  
  19.                     @Override  
  20.                     public void onClick(DialogInterface dialog, int which) {  
  21.                         dialog.dismiss();  
  22.                     }  
  23.                 })  
  24.                 .create();  
  25.         alertDialog.setCancelable(true);  
  26.         alertDialog.setCanceledOnTouchOutside(true);  
  27.         //和普通的dialog没什么区别了,想干什么就干什么了  
  28.         return alertDialog;  
  29.     }  
  30. }  
是不是很简单,没有什么技术含量吧,不过实际中往往需求多多啊,那就要开始自定义了。

        2.自定义view,还是一个title一个确定一个取消(布局就不贴出来了,太简单了)

        

[java] view plain copy
  1. public static class CustomViewDialg extends DialogFragment implements View.OnClickListener {  
  2.     private static final String NO_TITLE = "no_title";  
  3.     private boolean mNoTitle;  
  4.   
  5.     /** 
  6.      * @param noTitle 是否含有title 
  7.      * @return 
  8.      */  
  9.     public static CustomViewDialg getInstance(boolean noTitle) {  
  10.         CustomViewDialg customViewDialg = new CustomViewDialg();  
  11.         Bundle bundle = new Bundle();  
  12.         bundle.putBoolean(NO_TITLE, noTitle);  
  13.         customViewDialg.setArguments(bundle);  
  14.         return customViewDialg;  
  15.     }  
  16.   
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         mNoTitle = getArguments().getBoolean(NO_TITLE);  
  21.     }  
  22.   
  23.     @Nullable  
  24.     @Override  
  25.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  26.         if (mNoTitle) {  
  27.             getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);//设置dialog没有title  
  28.         }  
  29.         return inflater.inflate(R.layout.layout_custom_dialog, container, false);  
  30.         //这里需要说明一下,这个view的高度,由布局的所有控件高度与padding和margin的高度和  
  31.     }  
  32.   
  33.     @Override  
  34.     public void onViewCreated(View view, Bundle savedInstanceState) {  
  35.         view.findViewById(R.id.tv_cancle).setOnClickListener(this);  
  36.         view.findViewById(R.id.tv_ok).setOnClickListener(this);  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onActivityCreated(Bundle savedInstanceState) {  
  41.         super.onActivityCreated(savedInstanceState);  
  42.         getDialog().setCancelable(false);  
  43.         getDialog().setCanceledOnTouchOutside(false);  
  44.     }  
  45.   
  46.     @Override  
  47.     public void onClick(View v) {  
  48.         switch (v.getId()) {  
  49.             case R.id.tv_cancle:  
  50.                 this.dismiss();  
  51.                 break;  
  52.             case R.id.tv_ok:  
  53.                 this.dismiss();  
  54.                 break;  
  55.         }  
  56.     }  
  57. }  
这里需要注意,第一设置有没有title的代码位置,第二系统默认是都有title的,所以如果不加去掉title的代码,会很难看的。

        3.好了,现在我们需要自定义view的dialog的大小,显示的位置,怎么办?注意点都在代码的注释里了,不多说

[java] view plain copy
  1.     public static class CustomViewAnyPositionDialog extends DialogFragment {  
  2.         public static CustomViewAnyPositionDialog getInstance() {  
  3.             CustomViewAnyPositionDialog customViewAnyPositionDialog = new CustomViewAnyPositionDialog();  
  4.             return customViewAnyPositionDialog;  
  5.         }  
  6.   
  7.         @Override  
  8.         public void onCreate(Bundle savedInstanceState) {  
  9.             super.onCreate(savedInstanceState);  
  10.             //1 通过样式定义,DialogFragment.STYLE_NORMAL这个很关键的  
  11.             setStyle(DialogFragment.STYLE_NORMAL, R.style.MyDialog1);  
  12.   
  13.             //2代码设置 无标题 无边框  这个就很坑爹,这么设置很多系统效果就都没有了  
  14.             //setStyle(DialogFragment.STYLE_NO_TITLE|DialogFragment.STYLE_NO_FRAME,0);  
  15.   
  16.         }  
  17.   
  18.         @Nullable  
  19.         @Override  
  20.         public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  21.             //3 在此处设置 无标题 对话框背景色  
  22.             //getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);  
  23.             // dialog的背景色  
  24.             //getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.RED));  
  25.             //getDialog().getWindow().setDimAmount(0.8f);//背景黑暗度  
  26.             return inflater.inflate(R.layout.layout_custom_dialog1, container, false);  
  27.         }  
  28.   
  29.         @Override  
  30.         public void onViewCreated(View view, Bundle savedInstanceState) {  
  31.             super.onViewCreated(view, savedInstanceState);  
  32.         }  
  33.   
  34.         @Override  
  35.         public void onActivityCreated(Bundle savedInstanceState) {  
  36.             super.onActivityCreated(savedInstanceState);  
  37.             //注意下面这个方法会将布局的根部局忽略掉,所以需要嵌套一个布局  
  38.             Window dialogWindow = getDialog().getWindow();  
  39.             WindowManager.LayoutParams lp = dialogWindow.getAttributes();  
  40.             lp.gravity = Gravity.LEFT | Gravity.TOP;//改变在屏幕中的位置,如果需要改变上下左右具体的位置,比如100dp,则需要对布局设置margin  
  41. //            Display defaultDisplay = getActivity().getWindowManager().getDefaultDisplay();  
  42. //            lp.width = defaultDisplay.getWidth() - 200;  //改变宽度  
  43. //            lp.height=300;//   改变高度  
  44.             dialogWindow.setAttributes(lp);  
  45.   
  46.             getDialog().setCancelable(false);  
  47.             getDialog().setCanceledOnTouchOutside(false);  
  48.             getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {  
  49.                 @Override  
  50.                 public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {//可以在这拦截返回键啊home键啊事件  
  51.                     dialog.dismiss();  
  52.                     return false;  
  53.                 }  
  54.             });  
  55.         }  
  56.     }  
这里有一个很关键的stytle,所以必须要贴出来,否则会很坑爹,各种问题

[java] view plain copy
  1. <style name="MyDialog1" parent="Base.AlertDialog.AppCompat.Light">  
  2.     <!-- 背景颜色及透明程度 -->  
  3.     <item name="android:windowBackground">@android:color/transparent</item>  
  4.     <!-- 是否半透明 -->  
  5.     <item name="android:windowIsTranslucent">false</item>  
  6.     <!-- 是否没有标题 -->  
  7.     <item name="android:windowNoTitle">true</item>  
  8.     <!-- 是否浮现在activity之上 -->  
  9.     <item name="android:windowIsFloating">true</item>  
  10.     <!-- 是否背景模糊 -->  
  11.     <item name="android:backgroundDimEnabled">false</item>  
  12.     <!-- 设置背景模糊的透明度-->  
  13.     <item name="android:backgroundDimAmount">0.0</item>  
  14. </style>  
         4.好了,最后需要一个进出带动画效果的dialog,这里实现了一个从页面底部进入退出的效果,代码如下:

[java] view plain copy
  1. public static class CustomAnimationDialg extends DialogFragment {  
  2.     public static CustomAnimationDialg getInstance() {  
  3.         return new CustomAnimationDialg();  
  4.     }  
  5.   
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDatePickerDialog);  
  10.     }  
  11.   
  12.     @Nullable  
  13.     @Override  
  14.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  15.         return inflater.inflate(R.layout.layout_custom_dialog2, container, false);  
  16.     }  
  17.   
  18.     @Override  
  19.     public void onViewCreated(View view, Bundle savedInstanceState) {  
  20.         super.onViewCreated(view, savedInstanceState);  
  21.     }  
  22.   
  23.     @Override  
  24.     public void onActivityCreated(Bundle savedInstanceState) {  
  25.         super.onActivityCreated(savedInstanceState);  
  26.         Window dialogWindow = getDialog().getWindow();  
  27.         WindowManager.LayoutParams lp = dialogWindow.getAttributes();  
  28.         lp.width = ViewGroup.LayoutParams.MATCH_PARENT;  
  29.         lp.gravity = Gravity.BOTTOM;  
  30.         dialogWindow.setAttributes(lp);  
  31.     }  
  32. }  
  同样道理有个最关键的stytle必须贴出来,否则坑爹啊!

[java] view plain copy
  1. <style name="CustomDatePickerDialog" parent="@style/AppTheme">  
  2.     <item name="android:layout_width">match_parent</item>  
  3.     <item name="android:layout_height">wrap_content</item>  
  4.     <item name="android:windowIsFloating">true</item>  
  5.     <item name="android:background">#00000000</item>  
  6.     <item name="android:windowBackground">@android:color/transparent</item>  
  7.     <item name="android:colorBackgroundCacheHint">@null</item>  
  8.     <item name="android:backgroundDimEnabled">false</item>  
  9.     <item name="android:windowAnimationStyle">@style/dialog_animation</item>  
  10. </style>  
  11. <!-- 对话框显示和退出动画 -->  
  12. <style name="dialog_animation">  
  13.     <item name="android:windowEnterAnimation">@anim/dialog_enter</item>  
  14.     <item name="android:windowExitAnimation">@anim/dialog_exit</item>  
  15. </style>  
      最后贴出来进入的动画,退出的自己写吧

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <translate  
  4.         android:duration="1000"  
  5.         android:fillAfter="true"  
  6.         android:fromYDelta="100%"  
  7.         android:toYDelta="0%"/>  
  8. </set>  
最后就是一定要注意各个属性要在生命周期的哪个方法中设置,否则无效果或者崩溃,还有就是一定要注意stytle样式的重要性,很多问题都出在样式那了。


最后demo 下载地址   http://download.csdn.net/detail/zhq217217/9693368

阅读更多
换一批

没有更多推荐了,返回首页