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>