Change button color in AlertDialog
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:
@Overridepublic 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>
I have done by this code it might help you:
AlertDialog.Builder builder1 = new AlertDialog.Builder(this); builder1.setCancelable(true); builder1.setTitle("abc"); builder1.setMessage("abcdefg"); builder1.setInverseBackgroundForced(true); builder1.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); builder1.setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert11 = builder1.create(); alert11.show(); Button buttonbackground = alert11.getButton(DialogInterface.BUTTON_NEGATIVE); buttonbackground.setBackgroundColor(Color.BLUE); Button buttonbackground1 = alert11.getButton(DialogInterface.BUTTON_POSITIVE); buttonbackground1.setBackgroundColor(Color.BLUE);