¿Cómo puedo cambiar el color del título de AlertDialog y el color de la línea debajo de él?

Cambié el color de un título de AlertDialog usando este comando

alert.setTitle( Html.fromHtml("Set IP Address")); 

Pero quiero cambiar el color de la línea que aparece debajo del título; Cómo puedo hacer eso ?

Nota: no quiero usar un diseño personalizado

captura de pantalla del efecto deseado

Desafortunadamente, esta no es una tarea particularmente simple de lograr. En mi respuesta aquí , ListSeparator cómo ajustar el color de un ListSeparator simplemente revisando el estilo principal utilizado por Android, creando una nueva imagen y creando un nuevo estilo basado en el original. Desafortunadamente, a diferencia del estilo de AlertDialog , los temas de AlertDialog son internos y, por lo tanto, no se pueden referenciar como estilos principales. ¡No hay una manera fácil de cambiar esa pequeña línea azul! Por lo tanto, debe recurrir a la creación de cuadros de diálogo personalizados.

Si eso no es tu taza de té … ¡ no te rindas! Me molestó mucho que no hubiera una manera fácil de hacerlo, así que monté un pequeño proyecto en github para crear cuadros de diálogo holo-style rápidamente personalizados (suponiendo que el teléfono sea compatible con el estilo Holo). Puede encontrar el proyecto aquí: https://github.com/danoz73/QustomDialog

¡Debería permitir pasar fácilmente de aburrido azul a emocionante naranja!

enter image description here

El proyecto es básicamente un ejemplo del uso de un generador de diálogo personalizado, y en el ejemplo, creé una vista personalizada que parecía responder al ejemplo de dirección IP que daba en su pregunta original.

Con QustomDialog , para crear un cuadro de diálogo básico (título, mensaje) con un color diferente deseado para el título o divisor, utiliza el siguiente código:

 private String HALLOWEEN_ORANGE = "#FF7F27"; QustomDialogBuilder qustomDialogBuilder = new QustomDialogBuilder(v.getContext()). setTitle("Set IP Address"). setTitleColor(HALLOWEEN_ORANGE). setDividerColor(HALLOWEEN_ORANGE). setMessage("You are now entering the 10th dimension."); qustomDialogBuilder.show(); 

Y para agregar un diseño personalizado (por ejemplo, para agregar la pequeña dirección IP EditText ), agrega

 setCustomView(R.layout.example_ip_address_layout, v.getContext()) 

al constructor con un diseño que haya diseñado (el ejemplo de IP se puede encontrar en github). Espero que esto ayude. Muchas gracias a Joseph Earl y su respuesta aquí .

Color del divisor:

Es un truco un poco, pero funciona muy bien para mí y funciona sin ninguna biblioteca externa (al menos en Android 4.4).

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.dialog) .setIcon(R.drawable.ic) .setMessage(R.string.dialog_msg); //The tricky part Dialog d = builder.show(); int dividerId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); View divider = d.findViewById(dividerId); divider.setBackgroundColor(getResources().getColor(R.color.my_color)); 

Puede encontrar más identificadores de diálogo en el archivo alert_dialog.xml . P.ej. android:id/alertTitle para cambiar el color del título …

ACTUALIZACIÓN: color del título

Hack para cambiar el color del título:

 int textViewId = d.getContext().getResources().getIdentifier("android:id/alertTitle", null, null); TextView tv = (TextView) d.findViewById(textViewId); tv.setTextColor(getResources().getColor(R.color.my_color)); 

compruebe que esto es útil para usted …

 public void setCustomTitle (View customTitleView) 

obtienes detalles del siguiente enlace.

http://developer.android.com/reference/android/app/AlertDialog.Builder.html#setCustomTitle%28android.view.View%29

CustomDialog.java

 Dialog alert = new Dialog(this); alert.requestWindowFeature(Window.FEATURE_NO_TITLE); alert.setContentView(R.layout.title); TextView msg = (TextView)alert.findViewById(R.id.textView1); msg.setText("Hello Friends.\nIP address : 111.111.1.111"); alert.show(); 

title.xml

      

enter image description here

Esto establecerá el color para el título, el icono y el divisor. Vinculado para cambiar con cualquier nueva versión de Android.

 public static void colorAlertDialogTitle(AlertDialog dialog, int color) { int dividerId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); if (dividerId != 0) { View divider = dialog.findViewById(dividerId); divider.setBackgroundColor(color); } int textViewId = dialog.getContext().getResources().getIdentifier("android:id/alertTitle", null, null); if (textViewId != 0) { TextView tv = (TextView) dialog.findViewById(textViewId); tv.setTextColor(color); } int iconId = dialog.getContext().getResources().getIdentifier("android:id/icon", null, null); if (iconId != 0) { ImageView icon = (ImageView) dialog.findViewById(iconId); icon.setColorFilter(color); } } 

Recuerde llamar a dialog.show () antes de llamar a este método.

Al seguir el código fuente del Dialog , encontré que Title se genera en Class MidWindow inflando el diseño dialog_title_holo.xml . entonces Id de mTitleView es el title y el Id del divisor es titleDivider .

podemos acceder a Id of title simplemente por android.R.id.title .

y acceso a Id de titleDivider por Resources.getSystem().getIdentifier("titleDivider","id", "android");

El código final que usé para cambiar la Dirección del título y cambiar el color es:

 TextView mTitle = (TextView)findViewById(android.R.id.title); mTitle.setGravity(Gravity.RIGHT|Gravity.CENTER_VERTICAL); int x = Resources.getSystem().getIdentifier("titleDivider","id", "android"); View titleDivider = findViewById(x); titleDivider.setBackgroundColor(getContext().getResources().getColor(R.color.some_color)); 

Si no quieres una “biblioteca” para eso, puedes usar este truco mal:

 ((ViewGroup)((ViewGroup)getDialog().getWindow().getDecorView()).getChildAt(0)) //ie LinearLayout containing all the dialog (title, titleDivider, content) .getChildAt(1) // ie the view titleDivider .setBackgroundColor(getResources().getColor(R.color.yourBeautifulColor)); 

Esto fue probado y funciona en 4.x; no probado bajo, pero si mi memoria es buena debería funcionar para 2.x y 3.x

Si está creando un diseño personalizado para el diálogo de alerta

entonces puedes agregar de esta manera fácilmente para cambiar el color

  >  

Si utiliza un diseño de título personalizado , puede usarlo como alertDialog.setCustomTitle (customTitle);

Por ejemplo

 on UI thread used dialog like LayoutInflater inflater=LayoutInflater.from(getApplicationContext()); View customTitle=inflater.inflate(R.layout.customtitlebar, null); AlertDialog.Builder d=new AlertDialog.Builder(this); d.setCustomTitle(customTitle); d.setMessage("Message"); d.setNeutralButton("OK", null); d.show(); customtitlebar.xml         

Continuando con esta respuesta: https://stackoverflow.com/a/15285514/1865860 , bifurqué el buen repository github de @ daniel-smith e hice algunas mejoras:

  • Ejemplo mejorado Actividad
  • diseños mejorados
  • método fijo setItems
  • Se agregaron divisores en items_list
  • descartar los diálogos al hacer clic
  • soporte para elementos desactivados en métodos setItems
  • listItem touch feedback
  • mensaje de diálogo desplazable

enlace: https://github.com/dentex/QustomDialog

Se me ocurrió otra solución que maneja el estilo de tus diálogos en un lugar y no tienes que preocuparte cuando lo apliques – dialog show / not shown, que puede causar un error (debería llamar a requestFocus o algo así; PAG).

Ejemplo de uso:

 AlertDialog.Builder builder = new AlertDialog.Builder(context); AlertDialog dialog = builder.create(); //or builder.show() DialogViewDecorator.decorate(dialog, android.R.color.holo_red_light); //can also set the defaut color in the class 

Implementación:

 public class DialogViewDecorator { private static final @ColorRes int DEFAULT_TITLE_DIVIDER_COLOR = android.R.color.holo_orange_light; public static void decorate(Dialog dialog) { decorate(dialog, DEFAULT_TITLE_DIVIDER_COLOR); } /** * Sets the title divider color when the view is shown by setting DialogInterface.OnShowListener on the dialog. * 

* If you want to do other things onShow be sure to extend OnDecoratedDialogShownListener(call super.show(...)!) * and call {@link #decorate(Dialog, int, OnDecoratedDialogShownListener)}. * * @param dialog * @param titleDividerColor */ public static void decorate(Dialog dialog, final int titleDividerColor) { decorate(dialog, titleDividerColor, new OnDecoratedDialogShownListener(titleDividerColor)); } /** * Method for setting a extended implementation of OnDecoratedDialogShownListener. Don't forget to call super * or the titleDividerColor wont be applied! * * @param dialog * @param titleDividerColor * @param OnShowListener * @param */ public static void decorate(Dialog dialog, int titleDividerColor, T OnShowListener) { if (dialog == null || titleDividerColor <= 0) { return; } if (dialog.isShowing()) { setTitleDividerColor(dialog, titleDividerColor); } else { dialog.setOnShowListener(OnShowListener); } } private static void setTitleDividerColor(DialogInterface dialogInterface, int titleDividerColor) { try { Dialog dialog = (Dialog) dialogInterface; int dividerId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); View divider = dialog.findViewById(dividerId); if (divider != null) { divider.setBackgroundColor(dialog.getContext().getResources().getColor(titleDividerColor)); } } catch (Exception e) { e.printStackTrace(); } } public static class OnDecoratedDialogShownListener implements DialogInterface.OnShowListener { private int titleDividerColor; public OnDecoratedDialogShownListener() { this.titleDividerColor = DEFAULT_TITLE_DIVIDER_COLOR; } public OnDecoratedDialogShownListener(int titleDividerColor) { this.titleDividerColor = titleDividerColor; } @Override public void onShow(DialogInterface dialogInterface) { setTitleDividerColor(dialogInterface, titleDividerColor); } }}

En la clase onCreateView, puse esto:

 Dialog d = getDialog(); d.setTitle(Html.fromHtml("About")); int dividerId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); View divider = d.findViewById(dividerId); divider.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); 

enlaces primarios de color a nuestro archivo colors.xml que almacena todos los colores. También d.setTitle proporciona una forma d.setTitle de establecer el color del título.

En lugar de usar el divisor en el diálogo, use la vista en el diseño personalizado y establezca el diseño como diseño personalizado en el cuadro de diálogo.

custom_popup.xml:

         

activity.java:

 public void showPopUp(String title, String text) { LayoutInflater inflater = getLayoutInflater(); View alertLayout = inflater.inflate(R.layout.custom_popup, null); TextView txtContent = alertLayout.findViewById(R.id.txtPopup); txtContent.setText(text); TextView txtTitle = alertLayout.findViewById(R.id.txtTitle); txtTitle.setText(title); AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setView(alertLayout); alert.setCancelable(true); alert.setPositiveButton("Done", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); AlertDialog dialog = alert.create(); dialog.show(); } 

En caso de que esté utilizando extendiendo el diálogo, use:

 requestWindowFeature(Window.FEATURE_NO_TITLE); 
  ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLACK); String title = context.getString(R.string.agreement_popup_message); SpannableStringBuilder ssBuilder = new SpannableStringBuilder(title); ssBuilder.setSpan( foregroundColorSpan, 0, title.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ); AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder(context); alertDialogBuilderUserInput.setTitle(ssBuilder)