Android Dialog 的一些特性
1. Dialog 与 AlertDialog 的区别。
AlertDialog 是一种特殊形式的 Dialog。这个类中,我们可以添加一个,两个或者三个按钮,可以设置标题。所以,当我们想使用 AlertDialog 默认的按钮形式,用 AlertDialog 更加方便,而且有一个类 AlertDialog.Builder 很方便创建一个 AlertDialog。
2. Dialog 与 AlertDialog 写代码时需注意的事项。
我们可以给一个 Dialog 用自定义的 Layout。有两个位置可以设置 Layout。
- 一个是结构体中
- 一个是 onCreate 方法中
如果使用 AlertDialog,在结构体中需要写
View contentView = LayoutInflater.from(context).inflate(R.layout.cutomized_dialog, null); setView(contentView);
而不能直接写 setContentView(R.layout...); 这会导致错误:E/AndroidRuntime(4544): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
在 onCreate 里写的话,可以直接用 setContentView(R.layout...); 而不会导致错误。但是,这两种方法是有区别的!
如果写在结构体里,用的是 LayoutInflater,而真正的外壳依然是默认的 Dialog 的一个外壳。也就是有 Dialog 默认的标题,默认的背景颜色等。
但如果写在 onCreate 里,使用 setContentView(R.layout...); 这种情形下,Dialog 默认的 Layout 外壳就不存在了,而使用我们自定义的 Layout。比如你的 Layout 的背景颜色是透明,那么出来的 Dialog 的背景就是透明的。而写在结构体里的情况则背景色是系统 Dialog 默认的(黑或白一般)。而且这种方法下不可以再使用系统默认的标题栏了,因为它已经不存在了。所以如果你写上:
TextView titleText = (TextView) findViewById(android.R.id.title);
titleText.setText("testtitle");
你会得到一个 NullPointer 。因为 android.R.id.title 这个 Layout 已经被覆盖。
如果使用 Dialog,在结构体里,可以直接写 setContentView(R.layout.cutomized_dialog); 而不用 LayoutInflater。
在 onCreate 里的话,也是一样,直接写 setContentView(R.layout.cutomized_dialog);
也就是说,如果用的是 Dialog,两种方法写没有任何区别。都会使用默认的 Dialog 样式。如果想修改样式,则需给 Dialog 提供自定义的样式。
我曾经需要创建一个背景透明的 Dialog,可是不管我怎么改 style,都没有成功。最后解决方案是使用了 AlertDialog 然后在 onCreate 方法中使用自己的 Layout,并把它的背景设置为透明。
Dialog 透明效果成功。解决方案是给 Dialog 的背景设置为一个透明的图片。(有一篇文章可供参考,http://blog.csdn.net/sodino/article/details/5822147)
<item name="android:windowBackground">@drawable/a_transparent_image</item>
详情看下面的 xml 文件。
3. 一些参数
getWindow().setDimAmount(0);
这个函数用来设置 Dialog 周围的颜色。系统默认的是半透明的灰色。值设为0则为完全透明。
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="dialog" parent="@android:style/Theme.Dialog"> <!--边框--> <item name="android:windowFrame">@null</item> <!--是否浮现在activity之上--> <item name="android:windowIsFloating">true</item> <!--半透明--> <item name="android:windowIsTranslucent">false</item> <!--无标题--> <item name="android:windowNoTitle">true</item> <!--背景透明这种方法不好使--> <item name="android:windowBackground">@color/transparent</item> <!--背景透明正确方法--> <item name="android:windowBackground">@drawable/a_transparent_image</item> <!--模糊--> <item name="android:backgroundDimEnabled">false</item> </style> </resources><item name="android:windowBackground">@color/transparent</item>