Dialog设置宽高问题

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

一、Dialog宽高固定

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

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

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

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

二、Dialog全屏

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

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

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

你可能感兴趣的:(android,android,studio,android-studio)