设置Dialog的显示宽度

在项目中——一个基于 AOSP 的联系人修改的应用使用弹出框的时候,发现弹出框的宽度是根据其中内容的多少来决定宽度的,对于一个应用而言,UI 希望可以使用统一宽度的弹出框以达到和谐统一。

要在项目里实现统一弹出框宽度的要求,由于当时对源码中使用的各种 Style 不是很熟悉,不太敢改相关的样式,想到的一种方法是使用代码指定所需要的宽度。

方法

使用以下设置显示属性的方法去控制Dialog的显示宽度。

public static void setWidth(int dialogWidth, Dialog dialog, Context context) {
    if (dialog == null || context == null || dialogWidth < 0 || dialogWidth > 360) {
        return;
    }
    DisplayMetrics dm = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(dm);
    // 标准像素:屏幕宽度360dp
    // 若设置Dialog的宽度为 n dp,由于之前使用的 Dialog 样式中系统默认的属性中有个16dp的Padding ,所以实际显示为 (n - 32)dp
    // 所以:若设计稿为 m dp,则宽度需要设置为 (m + 32) / 360 * dm.widthPixels
    // 注:0.888888 --> m = 288 = 80% * 360 为当前样式系统默认下的最大宽度
    double ratio = 0.888888; // default value
    if (dialogWidth != 0) {
        ratio = (double) (dialogWidth + 32) / 360;
    }
    dialog.getWindow().setLayout((int) (dm.widthPixels * ratio), ViewGroup.LayoutParams.WRAP_CONTENT);
}

public static void setWidth(Dialog dialog, Context context) {
    setWidth(0, dialog, context);
}

调用方法的时机

举两个例子:

Dialog

对于Dialog,在其show之后立刻设置其显示属性。

mDialog = new AlertDialog.Builder(getActivity())
                .setIconAttribute(android.R.attr.alertDialogIcon)
                .setMessage(messageId)
                .setNegativeButton(android.R.string.cancel, null)
                .setPositiveButton(positiveButtonId,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int whichButton) {
                            doDeleteContact(contactUri);
                        }
                    }
                )
                .create();

mDialog.setOnDismissListener(this);
mDialog.show();
// 在show方法之后设置其显示属性
DialogUtils.setWidth(mDialog, getActivity());

DialogFragment

对于DialogFragment形式的Dialog,在onStart方法中设置显示属性。

@Override
public void onStart() {
    super.onStart();
    DialogUtils.setWidth(this.getDialog(), getActivity());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值