¿Cómo puedo cambiar el color del texto del botón de diálogo predeterminado en Android 5?

Resuelto FOMDeveloper asked hace 54 años • 18 respuestas

Tengo muchos cuadros de diálogo de alerta en mi aplicación. Es un diseño predeterminado pero estoy agregando botones positivos y negativos al diálogo. Entonces los botones obtienen el color de texto predeterminado de Android 5 (verde). Intenté cambiarlo sin éxito. ¿Alguna idea de cómo cambiar ese color de texto?

Mi cuadro de diálogo personalizado:

public class MyCustomDialog extends AlertDialog.Builder {

    public MyCustomDialog(Context context,String title,String message) {
        super(context);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View viewDialog = inflater.inflate(R.layout.dialog_simple, null, false);

        TextView titleTextView = (TextView)viewDialog.findViewById(R.id.title);
        titleTextView.setText(title);
        TextView messageTextView = (TextView)viewDialog.findViewById(R.id.message);
        messageTextView.setText(message);

        this.setCancelable(false);

        this.setView(viewDialog);

    } }

Creando el diálogo:

MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage);
builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ...
                        }
}).show();

Ese botón negativo es un botón de diálogo predeterminado y toma el color verde predeterminado de Android 5 Lollipop.

Muchas gracias

Diálogo personalizado con botón verde.

FOMDeveloper avatar Jan 01 '70 08:01 FOMDeveloper
Aceptado

Aquí tienes una forma natural de hacerlo con estilos:

Si AppThemese hereda de Theme.MaterialComponents, entonces:

<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#00f</item>
</style>

Si lo AppThemeheredas de Theme.AppCompat:

<style name="AlertDialogTheme" parent="ThemeOverlay.AppCompat.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#00f</item>
</style>

Usa AlertDialogThemetu en tuAppTheme

<item name="alertDialogTheme">@style/AlertDialogTheme</item>

o en constructor

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)

o si está utilizando MaterialAlertDialogBuilder, utilice

<item name="materialAlertDialogTheme">@style/AlertDialogTheme</item>
Alexander Perfilyev avatar Feb 21 '2017 17:02 Alexander Perfilyev

Puede intentar crear el AlertDialogobjeto primero y luego usarlo para configurar el cambio del color del botón y luego mostrarlo. (Tenga en cuenta que en el builderobjeto en lugar de llamar show()llamamos create()para obtener el AlertDialogobjeto:

//1. create a dialog object 'dialog'
MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage); 
AlertDialog dialog = builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ...
                }

            }).create();

//2. now setup to change color of the button
dialog.setOnShowListener( new OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(COLOR_I_WANT);
    }
});

dialog.show()

La razón por la que tiene que hacerlo onShow()y no puede simplemente obtener ese botón después de crear su cuadro de diálogo es que el botón aún no se habría creado.

Cambié AlertDialog.BUTTON_POSITIVEa AlertDialog.BUTTON_NEGATIVEpara reflejar el cambio en su pregunta. Aunque es extraño que el botón "Aceptar" sea un botón negativo. Suele ser el botón positivo.

trungdinhtrong avatar Jan 15 '2015 14:01 trungdinhtrong

El color de los botones y otro texto también se puede cambiar mediante tema:

valores-21/estilos.xml

<style name="AppTheme" parent="...">
  ...
  <item name="android:timePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:datePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:alertDialogTheme">@style/AlertDialogCustom</item>
</style>

<style name="AlertDialogCustom" parent="android:Theme.Material.Light.Dialog.Alert">
  <item name="android:colorPrimary">#00397F</item>
  <item name="android:colorAccent">#0AAEEF</item>
</style>

El resultado:

Diálogo Selector de fechas

peceps avatar Jul 20 '2015 10:07 peceps