1、 概述
DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。
在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。
2、 好处与用法
使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。上面会通过例子展示这些好处~
使用DialogFragment至少需要实现onCreateView或者onCreateDIalog方法。onCreateView即使用定义的xml布局文件展示Dialog。onCreateDialog即利用AlertDialog或者Dialog创建出Dialog。
3,重写onCreateView创建Dialog的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/gray_f2"
android:gravity="center"
android:paddingBottom="@dimen/dp_10"
android:paddingTop="10dp"
android:text="@string/add_car"
android:textSize="@dimen/text_size_16"/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginLeft="@dimen/dp_15"
android:layout_marginRight="@dimen/dp_15"
android:background="@color/gray_69"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/gray_f2"
android:orientation="horizontal"
android:paddingBottom="10dp"
android:paddingTop="@dimen/dp_10">
<LinearLayout
android:id="@+id/dialog_bottom_one"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:background="@mipmap/mycar"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="@string/car_lib_choose"
android:textColor="@color/gray_69"
android:textSize="@dimen/text_size_14"/>
LinearLayout>
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@color/gray_69"/>
<LinearLayout
android:id="@+id/dialog_bottom_two"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:background="@mipmap/byhand"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="@string/edit_choose_car"
android:textColor="@color/gray_69"
android:textSize="@dimen/text_size_14"/>
LinearLayout>
LinearLayout>
<Button
android:id="@+id/dialog_bottom_btnCancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:padding="5dp"
android:text="@string/cancel"
android:textColor="@color/black_4a"
android:textSize="@dimen/text_size_20"/>
LinearLayout>
4,自定义dialogFragment
public class MyDialog extends DialogFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//隐藏title
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置dialog的 进出 动画
getDialog().getWindow().setWindowAnimations(R.style.pop_bottom_anim);
// 设置在屏幕的底部。
Window window = getDialog().getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.gravity = Gravity.BOTTOM;
window.setBackgroundDrawable(new ColorDrawable(0xff000000));
window.setAttributes(lp);
//设置rootView
View rootView = inflater.inflate(R.layout.dialog_bottom, null);
return rootView;
}
}
5,设置dialog的style
dialogFragment进入时的动画
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="200"
android:fromYDelta="100%p"
android:toYDelta="0" />
<alpha
android:duration="200"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
set>
dialogFragment退出时的动画
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="200"
android:fromYDelta="0"
android:toYDelta="50%p" />
<alpha
android:duration="200"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
set>
如何调用呢,只需要一行代码
MyDialog myDialog = new MyDialog(); myDialog.show(getActivity().getFragmentManager(), "myDialog");
那么问题来了,是什么导致两边还有边距的呢,我也很纳闷。。。
我记得popupwindow显示不全的时候需要获取屏幕的宽高,并且设置给popupwindow
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
popupwindow mResendMailPopup = newPopupWindow(mResendMailPopupView,(int) (dm.widthPixels), (int) (dm.heightPixels), true);
//没有设置宽高显示不全的问题
mResendMailPopup.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
mResendMailPopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
然后我就对照着这样的方式试了一下
public class MyDialog extends DialogFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//隐藏title
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置dialog的 进出 动画
getDialog().getWindow().setWindowAnimations(R.style.pop_bottom_anim);
// 设置在屏幕的底部。
Window window = getDialog().getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.gravity = Gravity.BOTTOM;
window.setBackgroundDrawable(new ColorDrawable(0xff000000));
window.setAttributes(lp);
DisplayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
getDialog().getWindow().setLayout(dm.widthPixels, getDialog().getWindow().getAttributes().height);
//设置rootView
View rootView = inflater.inflate(R.layout.dialog_bottom, null);
return rootView;
}
}
然而并没有什么卵用。。。。
然后我就去度娘了
最后得到了答案….
@Override
public void onStart() {
super.onStart();
//解决不全屏的问题
DisplayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
getDialog().getWindow().setLayout(dm.widthPixels, getDialog().getWindow().getAttributes().height);
}
必须在onstart方法里面设置这个属性,具体原因我就没深究了,工头又叫搬砖了,还是搬砖去吧……。