Android – Estilo AlertDialog

Tengo un cuadro de diálogo de alerta en la aplicación como se muestra a continuación.

Introduzca aquí la descripción de la imagen

Quiero que el título y la línea que separa el título – el cuerpo del mensaje esté en color naranja. ¿Cómo puedo hacer esto? Lo que he intentado es usar estilo personalizado como se muestra a continuación. Pero esto no funcionó.

<style name="AboutDialog" parent="@android:style/Theme.Dialog"> <item name="android:textColor">#E5492A</item> </style> 

Mi código de diálogo de alerta:

 AlertDialog.Builder alertDialog = new AlertDialog.Builder( new ContextThemeWrapper(MainActivity.context, R.style.AboutDialog)); alertDialog.setTitle("Sample"); alertDialog.setMessage(R.string.rate_dialog_text); alertDialog.setPositiveButton(R.string.rate_now_text, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { MainActivity.context.startActivity(new Intent( Intent.ACTION_VIEW, Uri .parse("market://details?id=" + MainActivity.APP_PNAME))); if (editor != null) { editor.putBoolean("dontshowagain", true); editor.commit(); } dialog.dismiss(); } }); alertDialog.setNeutralButton(R.string.remind_later_text, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alertDialog.setNegativeButton(R.string.no_thanks_text, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (editor != null) { editor.putBoolean("dontshowagain", true); editor.commit(); } dialog.dismiss(); } }); return alertDialog.create(); } 

En lugar de:

 AlertDialog.Builder alertDialog = new AlertDialog.Builder( new ContextThemeWrapper(MainActivity.context, R.style.AboutDialog)); 

Prueba esto:

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this, R.style.AboutDialog); 

NOTA: Esto solo está disponible para API 11 (Android 3.0) y superior.

Si necesitas soportar Android <3.0, probablemente tengas que crear un cuadro de diálogo personalizado (en lugar de usar AlertDialog

EDIT Se agregó un truco muy malo basado en la reflexión

Si está realmente atascado y no desea implementar un diálogo personalizado, pruebe lo siguiente.

Después de haber creado el diálogo y justo antes de que quiera devolverlo, en lugar de esto:

 return alertDialog.create(); 

hacer esto:

 AlertDialog ad = alertDialog.create(); // Create the dialog // Add listener so we can modify the dialog before it is shown ad.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { // Set the text color on the dialog title and separator setTextColor(dialogInterface, 0xFFE5492A); } }); return ad; 

Ahora agregue este método muy reflexivo basado en la reflexión:

 public void setTextColor(DialogInterface alert, int color) { try { Class c = alert.getClass(); Field mAlert = c.getDeclaredField("mAlert"); mAlert.setAccessible(true); Object alertController = mAlert.get(alert); c = alertController.getClass(); Field mTitleView = c.getDeclaredField("mTitleView"); mTitleView.setAccessible(true); Object dialogTitle = mTitleView.get(alertController); TextView dialogTitleView = (TextView)dialogTitle; // Set text color on the title dialogTitleView.setTextColor(color); // To find the horizontal divider, first // get container around the Title ViewGroup parent = (ViewGroup)dialogTitleView.getParent(); // Then get the container around that container parent = (ViewGroup)parent.getParent(); for (int i = 0; i < parent.getChildCount(); i++) { View v = parent.getChildAt(i); if (v instanceof ImageView) { // We got an ImageView, that should be the separator ImageView im = (ImageView)v; // Set a color filter on the image im.setColorFilter(color); } } } catch (Exception e) { // Ignore any exceptions, either it works or it doesn't } } 

He probado esto en Android 2.2 y Android 4.0 y funciona. Puede que no haga exactamente lo que quiere, así que tendrás que probarlo. No puedo garantizar que funcionará en todos los dispositivos o en versiones futuras de Android, ya que depende mucho de la forma en que se implementa la clase AlertDialog (si cambian que en el futuro esto probablemente no funcionará).

Sólo unas cuantas notas para cualquiera que se preocupe:

  1. La razón por la que utilizo setOnShowListener() es porque no se puede llegar a los objetos internos de View que AlertDialog utiliza hasta después de haber sido inflados. No se inflan inmediatamente al crear un AlertDialog , sucede algún tiempo después. Utilizando el oyente podemos obtener el control después de que el diseño se infla pero antes de que se muestre el Dialog .

  2. Estoy utilizando la reflexión para acceder a las variables miembro interno en la implementación AlertDialog . Una vez que consigo el acceso al TextView que contiene el título, tengo que monkey alrededor para encontrar la línea horizontal que se utiliza para separar el título del mensaje. Para hacer esto obtengo el Layout que rodea el título (este Layout contiene el icono de alerta y el texto del título). Luego obtengo el Layout que lo rodea (este Layout envuelve el icono, el texto del título y el separador). Entonces miro a todos los niños de la disposición circundante y fijo el color en todos los objetos de ImageView adentro allí. El separador se implementa como un ImageView utilizando un dibujable, por lo tanto, no es posible simplemente cambiar el color. Nota: Una alternativa al uso de setColorFilter() sería reemplazar el dibujable en el ImageView con un dibujo adecuadamente coloreado aquí.

Gracias por el desafío, fue algo divertido descubrir esto 😀

Por el camino es una respuesta tardía, tal vez será útil para alguien. Para crear Custom AlertDialog y tener los mismos botones ordenados como el AlertDialog predeterminado. Siga el método simple a continuación

 final AlertDialog.Builder demoDialog = new AlertDialog.Builder(this); final LayoutInflater inflator = this.getLayoutInflater(); final View view = inflator.inflate(R.layout.passcode_req_dialog_template, null); demoDialog.setView(view) .setPositiveButton(R.string.ok_button_text, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .setNegativeButton(R.string.cancel_button_text, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); final AlertDialog dialog = passwordDialog.create(); dialog.show(); dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Get the work done here when pressing positive button dialog.dismiss(); } }); dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Get the work done here when pressing negative button dialog.dismiss(); } }); 

Intente crear un custom layout para el diálogo y proporcione ese layout a su cuadro de diálogo de alerta mediante

 dialog.setContentView(R.layout.customDialogLayout); 

Puede ver este ejemplo para el diálogo personalizado.

Tu puedes usar este proyecto AlertDialogPro . Incluya este proyecto en el suyo y defina su tema como a continuación:

 <style name="YourAppTheme.AlertDialogProTheme" parent="AlertDialogProTheme.Holo.Light"> <!-- Custom the title --> <item name="android:windowTitleStyle">@style/YourDialogWindowTitle</item> <!-- Change the title line to orange --> <item name="adpTitleDividerBackground">#E5492A</item> </style> <style name="YourDialogWindowTitle" parent="DialogWindowTitle.Holo.Light"> <item name="android:textColor">#E5492A</item> </style> 

Y especifica este tema al tema de tu aplicación con el atributo "alertDialogProTheme":

 <style name="AppTheme" parent="AppBaseTheme"> ... <item name="alertDialogProTheme">@style/YourAppTheme.AlertDialogProTheme</item> </style> 

Utilice AlertDialogPro.Builder para crear el diálogo:

 AlertDialogPro.Builder builder = new AlertDialogPro.Builder(getContext()); builder.setTitle(R.string.app_name). setMessage("Message"). setPositiveButton("Rate Now", null). setNeutralButton("Remind me later", null). setNegativeButton("No,thanks", null). show(); 

captura de pantalla

  • Diálogo de alerta personalizado
  • Los atributos de margen no funcionan dentro de un DialogFragment personalizado
  • Cómo crear un diálogo personalizado no deseable en android
  • Cómo establecer el tema para ProgressBar indeterminista en ProgressDialog en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.