Android Dialog 的一些特性

來源:互聯網
上載者:User

標籤:android   style   blog   class   code   java   

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>
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.