之前项目一直是使用Dialog,觉得没什么不好,但是看别人写的弹窗大多是使用DialogFragment,而且如果涉及到网络请求的话,用DialogFragment就好很多。
毕竟DialogFragment是extends Fragment的,可以在fragment的生命周期中做其他处理。
先看一个正常的弹窗。
@Override public void onActivityCreated(Bundle savedInstanceState) { Window window = getDialog().getWindow(); window.getDecorView().setPadding(0, 0, 0, 0); WindowManager.LayoutParams attributes = window.getAttributes(); attributes.width = (int) (ActivityUtil.getScreenWidth(getContext()) * 0.85); attributes.height = WindowManager.LayoutParams.WRAP_CONTENT; attributes.dimAmount = 0.8f; attributes.gravity = Gravity.CENTER; window.setAttributes(attributes); super.onActivityCreated(savedInstanceState); } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new Dialog(getActivity(), R.style.style_dialog); dialog.setCanceledOnTouchOutside(true); return dialog; }
在onActivityCreated的方法中,设置decorView的padding值,如果你的弹窗出现明明设置的MARCH_PARENT但是还是有边框值,就需要设置decorView的padding值。
然后则是设置window的LayoutParams的属性,其中有一个比较陌生的是dimAmount,这个其实就是没有内容区域的透明度。
在onCreateDialog方法中创建一个Dialog并且为它制定style。
<style name="style_dialog"> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="android:backgroundDimEnabled">true</item> <item name="android:windowFrame">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:indeterminateOnly">true</item> <item name="android:windowIsFloating">true</item> </style>
布局文件如下
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dimen_50" android:background="@drawable/bg_dialog_white" android:clipChildren="true" android:orientation="vertical" android:paddingLeft="@dimen/dimen_20" android:paddingRight="@dimen/dimen_20"> <TextView android:id="@+id/id_tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dimen_20" android:lineSpacingExtra="@dimen/dimen_3" android:paddingBottom="@dimen/dimen_10" android:paddingLeft="@dimen/dimen_15" android:paddingRight="@dimen/dimen_15" android:paddingTop="@dimen/dimen_10" android:text="@string/string_raider_task_explain" android:textColor="@color/color_333333" android:textSize="@dimen/dimen_14" /> <TextView android:id="@+id/id_tv_confirm" android:layout_width="@dimen/dimen_180" android:layout_height="@dimen/dimen_45" android:layout_below="@id/id_tv_content" android:layout_centerHorizontal="true" android:layout_marginBottom="@dimen/dimen_30" android:layout_marginTop="@dimen/dimen_30" android:background="@drawable/shape_bg_login" android:gravity="center" android:padding="@dimen/dimen_10" android:text="@string/string_confirm" android:textColor="@color/color_ffffff" android:textSize="@dimen/dimen_14" /> </RelativeLayout> <ImageView android:layout_width="wrap_content" android:layout_height="@dimen/dimen_80" android:layout_centerHorizontal="true" android:layout_gravity="center_horizontal" android:src="@mipmap/img_promote_dynamic" /> </FrameLayout>