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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章