標籤:android style blog class code java
1. Dialog 與 AlertDialog 的區別。
AlertDialog 是一種特殊形式的 Dialog。這個類中,我們可以添加一個,兩個或者三個按鈕,可以設定標題。所以,當我們想使用 AlertDialog 預設的按鈕形式,用 AlertDialog 更加方便,而且有一個類 AlertDialog.Builder 很方便建立一個 AlertDialog。
2. Dialog 與 AlertDialog 寫代碼時需注意的事項。
我們可以給一個 Dialog 用自訂的 Layout。有兩個位置可以設定 Layout。
如果使用 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>