Change button color in AlertDialog Change button color in AlertDialog android android

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