2010-06-25 88 views
19

我在我的應用程序中使用AlertDialog類。默認情況下,這些警報對話框具有透明背景。我試圖使用一個不透明的背景,而不是很成功。這是我的風格:如何更改Android警報對話框的背景?

<style name="MyOpaqueActivity" parent="@android:style/Theme.Dialog"> 
    <item name="android:windowBackground">@drawable/my_background</item> 
    <item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item> 
</style> 

<style name="MyOpaqueAlertDialog" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:background">#454545</item> 
    <item name="android:windowBackground">@drawable/my_background</item> 
    <item name="android:popupBackground">@drawable/my_background</item> 
</style> 

我成功申請了「MyOpaqueActivity」作風爲整個活動(該窗口背景變更爲「my_background」),但它並沒有爲這些活動中的警報對話框工作。 「alertDialogStyle」屬性和我的「MyOpaqueAlertDialog」風格似乎沒有任何作用。

那麼如何更改這些警報對話框的背景?

回答

11

你的方法不起作用。這似乎AlertDialog(和生成器)硬編碼的主題,不隨地兌現alertDialogStyle:

protected AlertDialog(Context context) { 
    this(context, com.android.internal.R.style.Theme_Dialog_Alert); 
} 

public Builder(Context context) { 
    this(context, com.android.internal.R.style.Theme_Dialog_Alert); 
} 

他們得出了相同的結論here

從AlertDialog派生的調用受保護的構造函數AlertDialog(context,R.style.MyOpaqueAlertDialog)的自定義對話框類將是一種解決方法。

在最新的android源代碼中,AlertDialog.Builder有一個新的公共構造函數,它需要一個主題參數。不幸的是,它還沒有發佈(可能在薑餅?)。

+1

你能詳細解釋一下你的答案,因爲它不準確。首先,你提到的問題不是真正的討論了警告對話**背景問題**;在那邊,它是關於按鈕的。其次,主題名稱被硬編碼的事實並不意味着主題不能被自定義。 – 2012-12-07 11:42:18

3

documentation看起來你可以在onCreateDialog中做到這一點。

FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom); 
fl.setBackgroundResource(); // has to be a drawable. 

只有其他解決方案是使用該主題的自定義對話框。

4

一旦你發現AlertDialogs有一些特殊的屬性,用XML風格很容易做到這一點。

但是,知道您指的是哪個Android版本(或針對​​的目標)會很有趣。據我所知,Theme.Dialog是相對較新的。在舊版本使用它們的所有情況下,較新的Android版本也不使用AlertDialogs。

這對我的作品在Android 2.2的:

<style name="MyTheme" parent="@android:style/Theme"> 
    <item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item> 
</style> 

<style name="MyOpaqueAlertDialog"> 
    <item name="android:fullDark">@drawable/[...]</item> 
    <item name="android:topDark">@drawable/[...]</item> 
    <item name="android:centerDark">@drawable/[...]</item> 
    <item name="android:bottomDark">@drawable/[...]</item> 
    <item name="android:fullBright">@drawable/[...]</item> 
    <item name="android:topBright">@drawable/[...]</item> 
    <item name="android:centerBright">@drawable/[...]</item> 
    <item name="android:bottomBright">@drawable/[...]</item> 
    <item name="android:bottomMedium">@drawable/[...]</item> 
    <item name="android:centerMedium">@drawable/[...]</item> 
</style> 

較新的Android版本也有Android版本:progressLayout和android:horizo​​ntalProgressLayout屬性的AlertDialog風格。

此外,在較新的Android版本中,可以通過在自定義主題中使用alertDialogTheme而不是alertDialogStyle來引用AlertDialog主題。 AlertDDialogThemes支持更多熟悉和更強大的屬性,如windowBackground,windowTitleStyle等。看看styles.xml和themes.xml。

不幸的是,哪些功能的文檔在超差時添加。請自己找出最適合你的方法。