How to change dialog background color programmatically?
Asked Answered
D

5

20

I have a main activity where users can change (via preferences) the background colour to their favourite colour. My problem is that I can not change the background colour of of any custom dialogs.

Other answers in stack overflow suggest:

(a) overiding the default theme to the preferred colour. I don't think is a suitable solution in this case as I know changing themes at run time is not recommended.

(b) Changing in styles.xml (not suitable in this case as I can't change at run time)

(c) Overriding the AlertBuilder class (but this tints the whole alert dialog)

This closest I have come to changing the colour is removing the alert builder title, and setting the custom view's background to the favourite colour (eg.pink). Unfortunately this gives an ugly strip at the top and bottom of the dialog.

Code is included after image, suggestions about how to change dialog background would be greatly appreciated.

Dialog appearance

Code for the default appearance

protected Dialog onCreateDialog(int dialogId) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);


        final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root));
              builder.setView(viewMessEdit);
        builder.setTitle("Alert builder's title");
}

Code for changing the custom dialog views background colour (and the Alert builder's title is removed)

protected Dialog onCreateDialog(int dialogId) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);


        final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root));
              builder.setView(viewMessEdit);
              viewMessEdit.setBackgroundResource(R.color.pink_dark);

}
Deflate answered 1/9, 2011 at 11:35 Comment(1)
can you finish this dialog as your pic? if yes ,can you share?Parterre
P
8

I kinda faced the same problem. And the only way to solve it was extending my own version of layout. I see that in your case it is an AlertDialog. What I recommend you to do, is to create a unique class, that is your customized AlertDialog and create a layout for this, and then you inflate this.

Here is a post that helped me a lot. http://blog.androgames.net/10/custom-android-dialog/

I followed this post and solved my problem with customizing dialogs.

Please, if you have more doubts, let me know.

Thanks.

Preteritive answered 1/9, 2011 at 12:13 Comment(2)
Thankyou for that link to the androgames post. It was clearly written and well commented. Here is related blog post. dtmilano.blogspot.com/2010/01/android-ui-colored-dialogs.htmlDeflate
I've updated the link to a cached version using the WayBack Machine.Mizuki
M
20

I found a one rule solution!

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground);

It works for me with a normal dialog. But I dont know if it works on an AlertDialog.

Monosome answered 6/8, 2014 at 14:2 Comment(2)
I just tried it, it doesn't. I tried with a solid color and my color appeared instead of the alertdialog's shadow in the background.Tellurize
this is not op solution, but helped me out cause I actually needed this :DOrleanist
P
8

I kinda faced the same problem. And the only way to solve it was extending my own version of layout. I see that in your case it is an AlertDialog. What I recommend you to do, is to create a unique class, that is your customized AlertDialog and create a layout for this, and then you inflate this.

Here is a post that helped me a lot. http://blog.androgames.net/10/custom-android-dialog/

I followed this post and solved my problem with customizing dialogs.

Please, if you have more doubts, let me know.

Thanks.

Preteritive answered 1/9, 2011 at 12:13 Comment(2)
Thankyou for that link to the androgames post. It was clearly written and well commented. Here is related blog post. dtmilano.blogspot.com/2010/01/android-ui-colored-dialogs.htmlDeflate
I've updated the link to a cached version using the WayBack Machine.Mizuki
F
6

I have found a hack, without creating custom layout you can create multiple designs by playing with some properties of AlertDialog.

What you have to do:

When AlertDialog is visible on your screen, OnShowListener is called. So, by adding dialog.setOnShowListener(this) you will be able to customize your AlertDialog.

Code:

// Create AlertDialog
AlertDialog.Builder adb = new AlertDialog.Builder(context1);
    adb.setTitle(context1.getString(R.string.app_name))
    .setMessage(message)
    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
});
AlertDialog dialog = adb.create();

// Make some UI changes for AlertDialog
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(final DialogInterface dialog) {

        // Add or create your own background drawable for AlertDialog window
        Window view = ((AlertDialog)dialog).getWindow();
        view.setBackgroundDrawableResource(R.drawable.your_drawable);

        // Customize POSITIVE, NEGATIVE and NEUTRAL buttons.
        Button positiveButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE);
        positiveButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
        positiveButton.setTypeface(Typeface.DEFAULT_BOLD);
        positiveButton.invalidate();

        Button negativeButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEGATIVE);
        negativeButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
        negativeButton.setTypeface(Typeface.DEFAULT_BOLD);
        negativeButton.invalidate();

        Button neutralButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEUTRAL);
        neutralButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
        neutralButton.setTypeface(Typeface.DEFAULT_BOLD);
        neutralButton.invalidate();
    }
});
Fairley answered 11/2, 2016 at 7:24 Comment(0)
C
5

Dialogue background colour

dialog.getWindow().setBackgroundDrawableResource(R.color.glassblack);

really worked fine for me.

Coffee answered 26/9, 2016 at 6:27 Comment(0)
C
1

The suggested solution

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground);

Do not work well (tested in 6.0) as it changes the dialog shadow

Here Is my solution:

 public static void changeDialogBackground(final Dialog dialog,final int resId) {
    dialog.getWindow().getDecorView().setBackgroundResource(resId);
    dialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(final DialogInterface dialog) {
            Window window = ((AlertDialog)dialog).getWindow();
            window.getDecorView().setBackgroundResource(resId);
        }
    });
}
Cruel answered 12/8, 2016 at 8:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.