How can I change the background of Android alert dialogs?
Asked Answered
M

3

19

I use the AlertDialog class in my application. By default, these alert dialogs have a transparent background. I'm trying to use an opaque background instead, very unsuccessfully. These are my styles:

<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 applied the "MyOpaqueActivity" style successfully for whole activities (the window background is changed to "my_background"), but it doesn't work for alert dialogs within those activities. The "alertDialogStyle" attribute and my "MyOpaqueAlertDialog" style don't seem to have any effect.

So how can I change the background of these alert dialogs?

Mac answered 25/6, 2010 at 14:1 Comment(0)
D
11

Your approach won't work. It seems AlertDialog (and Builder) hardcode the theme and don't honor alertDialogStyle anywhere:

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

They came to the same conclusion here.

A custom dialog class derived from AlertDialog that calls the protected constructor AlertDialog(context, R.style.MyOpaqueAlertDialog) would be a workaround.

In the latest android source, there is a new public constructor for AlertDialog.Builder that takes a theme argument. Unfortunately, it hasn't been released yet (maybe in Gingerbread?).

Dishman answered 25/6, 2010 at 16:7 Comment(1)
can you elaborate on your answer a bit, because it is inaccurate. First, it is not true that the question you refer to discusses the issue of alert dialog backgrounds; over there, it's about buttons. Second, the fact that the name of a theme is hardcoded does not mean that the theme cannot be customized.Coachwhip
C
4

It's easy to do this in an XML style once you figure that AlertDialogs have somewhat special attributes.

However, it would be interesting to know which Android version you're referring to (or are targeting at). Theme.Dialog is relatively new as far as I know. Newer Android versions also don't use AlertDialogs under all circumstances where older versions used them.

This works for me 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>

Newer Android versions also have android:progressLayout and android:horizontalProgressLayout attributes for the AlertDialog style.

Also, in newer Android versions, it is possible to refer to an AlertDialog theme by using alertDialogTheme instead of alertDialogStyle in a custom theme. AlertDDialogThemes support more familiar and more powerful attributes like windowBackground, windowTitleStyle etc. Have a look at styles.xml and themes.xml.

Unfortunately, the documentation of which feature was added when is super poor. Please find out for yourself whcih approach is the best for you.

Coachwhip answered 7/12, 2012 at 12:29 Comment(0)
T
3

From the documentation its looks like you could do this in onCreateDialog.

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

Only other solution is a custom dialog using that Theme.

Tailband answered 25/6, 2010 at 14:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.