Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change button color in AlertDialog

How can I change the color of the button(s) in an AlertDialog in Android?

like image 687
mtr Avatar asked Nov 04 '10 10:11

mtr


People also ask

How do I change button color in AlertDialog?

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.

Is AlertDialog deprecated?

A simple dialog containing an DatePicker . This class was deprecated in API level 26.

Which method is used to set in AlertDialog?

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.

What is AlertDialog builder in Android?

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.


2 Answers

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

like image 125
jbpin Avatar answered Sep 25 '22 17:09

jbpin


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> 
like image 43
Blacklight Avatar answered Sep 26 '22 17:09

Blacklight