How can I change the background of Android alert dialogs?

后端 未结 3 1620
盖世英雄少女心
盖世英雄少女心 2020-11-27 19:44

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 unsuccess

相关标签:
3条回答
  • 2020-11-27 20:02

    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.

    0 讨论(0)
  • 2020-11-27 20:06

    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.

    0 讨论(0)
  • 2020-11-27 20: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?).

    0 讨论(0)
提交回复
热议问题