2010-06-25 10 views
19

Ich verwende die AlertDialog-Klasse in meiner Anwendung. Diese Warndialoge haben standardmäßig einen transparenten Hintergrund. Ich versuche stattdessen einen undurchsichtigen Hintergrund zu verwenden, sehr erfolglos. Das sind meine Stile:Wie kann ich den Hintergrund von Android-Warndialogen ändern?

<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> 

I angewandt, um den „MyOpaqueActivity“ Stil erfolgreich für ganze Aktivitäten (das Fenster Hintergrund auf „my_background“ geändert), aber es funktioniert nicht für Alarm Dialoge im Rahmen dieser Tätigkeiten. Das Attribut "alertDialogStyle" und mein "MyOpaqueAlertDialog" -Stil scheinen keine Wirkung zu haben.

Wie kann ich den Hintergrund dieser Alarmdialoge ändern?

Antwort

11

Ihr Ansatz wird nicht funktionieren. Es scheint, Alertdialog (und Builder) codieren, das Thema und nicht alertDialogStyle überall ehren:

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); 
} 

Sie zu dem gleichen Schluss kam here.

Eine von AlertDialog abgeleitete benutzerdefinierte Dialogklasse, die den geschützten Konstruktor AlertDialog (context, R.style.MyOpaqueAlertDialog) aufruft, wäre eine Umgehungslösung.

In der neuesten Android-Quelle gibt es einen neuen öffentlichen Konstruktor für AlertDialog.Builder, der ein Theme-Argument verwendet. Leider wurde es noch nicht veröffentlicht (vielleicht in Gingerbread?).

+1

können Sie näher auf Ihre Antwort eingehen, weil sie ungenau ist. Erstens ist es nicht wahr, dass die Frage, auf die Sie verweisen, das Problem des Alarmdialogs behandelt ** Hintergründe **; da drüben geht es um Knöpfe. Zweitens bedeutet die Tatsache, dass der Name eines Themas fest codiert ist, nicht, dass das Thema nicht angepasst werden kann. –

3

Von der documentation sieht es aus wie Sie dies in onCreateDialog tun können.

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

Nur eine andere Lösung ist ein benutzerdefinierter Dialog mit diesem Thema.

4

Es ist einfach, dies in einem XML-Stil zu tun, sobald Sie feststellen, dass AlertDialogs etwas spezielle Attribute haben.

Es wäre jedoch interessant zu wissen, auf welche Android-Version Sie sich beziehen (oder auf die Sie abzielen). Theme.Dialog ist soweit ich weiß relativ neu. Neuere Android-Versionen verwenden auch nicht AlertDialogs unter allen Umständen, wo ältere Versionen sie verwendeten. Diese

funktioniert für mich in 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> 

Neuere Android-Versionen haben auch android: progressLayout und android: horizontalProgressLayout Attribute für den Stil Alertdialog.

In neueren Android-Versionen ist es möglich, auf ein AlertDialog-Thema zu verweisen, indem Sie in einem benutzerdefinierten Design alertDialogTheme anstelle von alertDialogStyle verwenden. AlertDDialogThemes unterstützt vertrautere und leistungsfähigere Attribute wie windowBackground, windowTitleStyle usw. Sehen Sie sich styles.xml und themes.xml an.

Leider wurde die Dokumentation der Feature hinzugefügt, wenn super arm ist. Finden Sie selbst heraus, welche Vorgehensweise für Sie am besten ist.

Verwandte Themen