How can I change the color of the button(s) in an AlertDialog
in Android?
You can just create a style and apply that theme on the dialog box. So whenever you want to change the color of AlertDialog box, just change color in styles. xml and all the dialog boxes will be updated in the whole application.
A simple dialog containing an DatePicker . This class was deprecated in API level 26.
Alert Dialog code has three methods: setTitle() method for displaying the Alert Dialog box Title. setMessage() method for displaying the message. setIcon() method is use to set the icon on Alert dialog box.
Android AlertDialog can be used to display the dialog message with OK and Cancel buttons. It can be used to interrupt and ask the user about his/her choice to continue or discontinue. Android AlertDialog is composed of three regions: title, content area and action buttons.
Here is how I did.
AlertDialog.Builder customBuilder = new AlertDialog.Builder(new ContextThemeWrapper(this,android.R.style.Theme_Dialog)); customBuilder.setTitle(R.string.popup_error_title); customBuilder.setNegativeButton("Exit application", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { MyActivity.this.finish(); } }); AlertDialog dialog = customBuilder.create(); dialog.show(); Button b = dialog.getButton(DialogInterface.BUTTON_NEGATIVE); if(b != null) { b.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_button)); }
I find the drawable here
Since most people are probably using a DialogFragment by now I ran into some issues and clicked my way through several SO answers to solve those. Let me post my current solution.
I ended up setting the button-background with custom drawables as already suggested several times. However, this was not yet possible in the onCreateDialog
-method of the DialogFragment
. You can either do this e.g. in onStart()
, or (which is what I preferred) in the onShow
-listener of the dialog! Keep in mind though, you need to invalidate your buttons after the changes then.
As for the margins: simple remove the padding in your Drawable-XML for the buttons.
#onCreateDialog in your DialogFragment:
@Override public Dialog onCreateDialog(final Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // setup your dialog here... builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { // do something } }); builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { // do something } }); final AlertDialog dialog = builder.create(); dialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(final DialogInterface dialog) { Button negativeButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEGATIVE); Button positiveButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE); // this not working because multiplying white background (e.g. Holo Light) has no effect //negativeButton.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY); final Drawable negativeButtonDrawable = getResources().getDrawable(R.drawable.alert_dialog_button_light_red); final Drawable positiveButtonDrawable = getResources().getDrawable(R.drawable.alert_dialog_button_light_green); if (Build.VERSION.SDK_INT >= 16) { negativeButton.setBackground(negativeButtonDrawable); positiveButton.setBackground(positiveButtonDrawable); } else { negativeButton.setBackgroundDrawable(negativeButtonDrawable); positiveButton.setBackgroundDrawable(positiveButtonDrawable); } negativeButton.invalidate(); positiveButton.invalidate(); } }); return dialog; }
Drawable-XML example for a button:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape> <gradient android:startColor="@color/alert_dialog_button_green_pressed1" android:endColor="@color/alert_dialog_button_green_pressed2" android:angle="270" /> </shape> </item> <item android:state_focused="true" > <shape> <gradient android:endColor="@color/alert_dialog_button_green_focused1" android:startColor="@color/alert_dialog_button_green_focused2" android:angle="270" /> </shape> </item> <item> <shape> <gradient android:endColor="@color/alert_dialog_button_green1" android:startColor="@color/alert_dialog_button_green2" android:angle="270" /> </shape> </item> </selector>
Don't forget to define your colors in the res\values\colors.xml
, e.g. like this (I didn't want a gradient, therefore colors 1 & 2 are the same):
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="alert_dialog_button_green1">#b4099930</color> <color name="alert_dialog_button_green2">#b4099930</color> <color name="alert_dialog_button_green_focused1">#96099930</color> <color name="alert_dialog_button_green_focused2">#96099930</color> <color name="alert_dialog_button_green_pressed1">#96099930</color> <color name="alert_dialog_button_green_pressed2">#96099930</color> </resources>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With