使用DialogFragment遇到的一些问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值