使用DialogFragment可以任意实现以下两个方法:
1、onCreateView
2、onCreateDialog
但是当需要创建一个宽度撑满屏幕或者位于屏幕底部的Dialog时,使用onCreateView无法满足需求,创建的Dialog总是离屏幕边缘或者底部有一点间距;这时必须通过onCreateDialog来实现。
<span style="white-space:pre"> </span>View view = LayoutInflater.from(activity).inflate(R.layout.xxx, null);
<span style="white-space:pre"> </span>AlertDialog dialog = new AlertDialog.Builder(activity, R.style.ShareDialogTheme).setView(view).create();
不过在onCreateDialog中,也需要注意:
1、需要给dialog指定一个样式,否则会使用默认的样式,还是无法撑满屏幕。
<style name="ShareDialogTheme" parent="@style/AppTheme">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:windowIsFloating">true</item>
</style>
2、使用setView,而不是使用dialog的setContentView,如果使用后者,在父类的onStart里会调用AlertDialog的onCreate,最终会调用requestWindowFeature,就会抛异常“requestWindowFeature必须在setContentView前调用”。
3、在onStart里去改变Dialog的位置和大小,在onCreateDialog里无效。
@Override
public void onStart() {
super.onStart();
Window window = getDialog().getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(wlp);
}
还有一种方法是直接new一个Dialog:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new Dialog(getActivity(), R.style.ShareDialogTheme);
dialog.setContentView(R.layout.xxx);
Window window = dialog.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(wlp);
return dialog;
}
就可以使用setContentView,因为Dialog的onCreate是一个空实现,在DialogFragment的onStart里调用它的时,不会去调requestWindowFeature,也可以直接在onCreateDialog里去改变大小和位置,也是因为这个原因。不过直接new一个Dialog,谷歌并不推荐。