Android Dialog去掉黑色背景
不同版本的Dialog不一样,为了统一Dialog的界面同时也想定义一个更好看的Dialog,所以我们经常会使用自定义的Layout并且调用setContentView加载到Dialog,但是我们会发现contentView显示出来了,但是他的后面会有一点黑框框的边角料,百度搜了一下,按下面定义一个样式:
<style name="MyDialog" parent="Animation.AppCompat.Dialog">
<item name="android:windowFrame">@null</item>
<!--最后面是window background-->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">false</item>
<!--这个不设置它会沾满屏幕-->
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<!-- 设置contentview的背景图-->
<item name="android:background">@drawable/myshape</item>
</style>
解释一下这个这段代码
1.<item name="android:windowFrame">@null</item>
windowFrame属性的值可以是drawable,设置完了这个drawable就会显示在Dialog的前面,挡住我们的视线,所以这里我们设置为null。
2.<itemname="android:windowBackground">@android:color/transparent</item>
这段是主要代码,我们把它设置成了android:color/transparent (透明色)这样后面的黑边就没有了。我是这样理解的(没有研究过源码,纯属测试之后的个人理解)。在dialog显示的弹框中,最底层的是一个Window,在window上面就是我们的ContentView,也可以这两理解:把一幅画挂在墙上,墙就是Window,画就是ContentView,我们把windowBackground设置成透明的,这样我们就只可以看到画而看不到墙了。
3.<item name="android:background">@drawable/myshape</item>
这个是给ContentView设置的background,也可以不写这里,写在自定义的布局里面。
4.<item name="android:windowIsFloating">true</item>
这个设置成true的时候就是正常的弹框,设置成false就会全屏。
5.<item name="android:windowContentOverlay">@null</item>
官方文档这样写的This Drawable is overlaid over the foreground of the Window's content area, usually to place a shadow below the title.
也就是这个可以设置一个drawable或者color,一般是半透明的,然后就会在ContentView区域显示(相当于使你的Contentview有朦胧感)。
最后我们需要做的就是自定义MyDialog继承Dialog然后把带有Theme的方法设置成public然后new的时候把自定义的style传进去就可以了,,如下。
public class MyDialog extends Dialog {
public MyDialog(Context context) {
super(context);
}
public MyDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
public MyDialog(Context context, int theme) {
super(context, theme);
}
}
//然后调用new MyDialog(this,R.style.MyDialog)