Dialog设置宽高问题

最近在做需求的时候,由于有大量的弹窗,所以基本上弹窗都使用了Dialog进行实现。但是没想到Dialog真难用啊。最令人崩溃的就是它的宽高问题了,Dialog会忽视根布局中的宽高设置,最终宽度会由Dialog的style中的android:windowMinWidthMinor属性决定,高度会表现为wrap_content,所以说在根布局中设置宽高是没有用的,而这个属性也往往不能满足我们的需求,下面我根据不同的情况写一下如何设置Dialog的宽高。

一、Dialog宽高固定

刚刚提到,由于根布局的宽高属性会被忽略,如果我们想实现固定宽高的Dialog,可以选择在根布局之下再包一层布局,将这个布局的宽高写成固定值即可。然而Dialog会默认的自带一个状态栏的高度,这个高度会让我们设置Dialog位置的时候不符合预期,此外需要一般需要开启背景暗淡。因此需要给Dialog设置Style,如下

<style name="ProvinceDialog" parent="android:Theme.Dialog">
        <!--背景暗淡-->
        <item name="android:backgroundDimEnabled">true</item>
        <!--去掉标题栏-->
        <item name="android:windowNoTitle">true</item>
    </style>

使用方法让Dialog继承这个就行,如下

class ProvinceSelectorDialog(context: Context) : Dialog(context, R.style.ProvinceDialog)

当然用代码设置宽高也可以,代码的优先级应该高于style。

二、Dialog全屏

和固定宽高不同,如果要使Dialog全屏的话并不需要在布局中多包一层,上文提到根布局的宽高属性会被忽略,而宽由Dialog的style中的android:windowMinWidthMinor属性决定,高度会表现为wrap_content。那么我们依然想办法在style中解决全屏的问题。先看结果

<style name="MoreSelectorDialog" parent="android:Theme.Dialog">
        <!--使 Dialog 全屏-->
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowIsFloating">false</item>
        <!--去掉标题栏-->
        <item name="android:windowNoTitle">true</item>
        <!--背景透明-->
        <item name="android:windowBackground">#00ffffff</item>
        <!--状态栏透明-->
        <item name="android:windowTranslucentStatus">true</item>
    </style>

采用这些属性即可达到全屏的效果。我做一下简单的解释,采用windowIsFloating为false可以使Dialog悬浮在Activity上,可以达到一个伪全屏的效果,类似在代码中设置宽高为match_parent。之所以叫伪全屏是因为它上下左右还有一定的间距。尤其是上方会有一个状态栏,即使设置了windowNoTitle为true,依然会有。因此需要搭配windowFullscreen为true。这样就可以去除状态栏。去除状态栏之后,设置背景透明即可达到一个理想的全屏效果。但是当打开Dialog时状态栏会呈现黑色,因此需要加上状态栏透明。

当然肯定也有方法在代码中做到,但我认为关于布局的问题,尽量不在代码中解决,代码中应该更注重业务逻辑的编写,尽量不让它们写在一起。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值