使用DialogFragment遇到的一些问题

使用DialogFragment可以任意实现以下两个方法:

1、onCreateView

2、onCreateDialog

但是当需要创建一个宽度撑满屏幕或者位于屏幕底部的Dialog时,使用onCreateView无法满足需求,创建的Dialog总是离屏幕边缘或者底部有一点间距;这时必须通过onCreateDialog来实现。

	View view = LayoutInflater.from(activity).inflate(R.layout.xxx, null);
	AlertDialog dialog = new AlertDialog.Builder(activity, R.style.ShareDialogTheme).setView(view).create();

不过在onCreateDialog中,也需要注意:

1、需要给dialog指定一个样式,否则会使用默认的样式,还是无法撑满屏幕。

    

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,谷歌并不推荐。

你可能感兴趣的:(android,笔记,android,DialogFragment)