¿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("<font color='#FF7F27'>Set IP Address</font>")); 

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

Nota: no quiero usar un diseño personalizado

Captura de pantalla del efecto deseado

Desafortunadamente, esto no es una tarea particularmente simple de lograr. En mi respuesta aquí , detallaré cómo ajustar el color de un ListSeparator simplemente revisando el estilo padre 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 primarios. ¡No hay manera fácil de cambiar esa pequeña línea azul! Por lo tanto, es necesario recurrir a la creación de diálogos personalizados.

Si eso no es tu taza de té … no te rindas! Estaba muy perturbado que no había una manera fácil de hacer esto así que configuré un pequeño proyecto en github para hacer cuadros de diálogo holo-modificados para requisitos particulares rápidamente (asumiendo que el teléfono apoya el estilo de Holo). Puede encontrar el proyecto aquí: https://github.com/danoz73/QustomDialog

¡Debe facilitar fácilmente el ir del azul aburrido al naranja emocionante!

Introduzca aquí la descripción de la imagen

El proyecto es básicamente un ejemplo de uso de un constructor de diálogo personalizado, y en el ejemplo he creado una vista personalizada que parecía responder al ejemplo de dirección IP que da en su pregunta original.

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

 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 ), se 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 el github). Espero que esto ayude. Muchas gracias a Joseph Earl y su respuesta aquí .

Color del divisor:

Es un hack 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 ID 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)); 

Comprobar esto es útil para usted …

 public void setCustomTitle (View customTitleView) 

Usted consigue el detalle del acoplamiento siguiente.

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

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Set IP address" android:textColor="#ff0000" android:textAppearance="?android:attr/textAppearanceLarge" /> <ImageView android:layout_width="fill_parent" android:layout_height="2dp" android:layout_marginTop="5dp" android:background="#00ff00" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#775500" android:textAppearance="?android:attr/textAppearanceLarge" /> 

Introduzca aquí la descripción de la imagen

Esto establecerá el color del título, icono y 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.

Siguiendo el código fuente Dialog , encontré que Title se genera en Class MidWindow al inflar el layout dialog_title_holo.xml . Por lo que el Id de mTitleView es title y el Id de divisor es titleDivider .

Podemos acceder a Id de title simplemente por android.R.id.title .

Y el 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 "librería" para eso, puedes usar este mal hack:

 ((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 el trabajo en 4.x; No probado debajo, pero si mi memoria es buena debe trabajar para 2.x y 3.x

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

Entonces usted puede agregar como esta manera fácilmente para cambiar el color

 <LinearLayout android:id="@+id/DialogTitleBorder" android:layout_width="fill_parent" android:layout_height="1dip" android:layout_below="@id/mExitDialogDesc" android:background="#4BBAE3" <!--change color easily --> > </LinearLayout> 

Si su uso de diseño de título personalizado, entonces puede utilizarlo 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 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="#525f67"> <ImageView android:id="@+id/icon" android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/ic_launcher" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" > </ImageView> <TextView android:id="@+id/customtitlebar" android:layout_width="match_parent" android:layout_height="40dp" android:textColor="#ffffff" android:text="Title Name" android:padding="3px" android:textStyle="bold" android:layout_toRightOf="@id/icon" android:layout_alignParentTop="true" android:gravity="center_vertical"/> <ImageView android:layout_width="match_parent" android:layout_height="2dp" android:background="#ff0000" android:layout_below="@id/icon"><!-- This is line below the title --> </ImageView> </RelativeLayout> 

En caso de que esté utilizando la extensión del diálogo, use:

RequestWindowFeature (Window.FEATURE_NO_TITLE);

Continuando con esta respuesta: https://stackoverflow.com/a/15285514/1865860 , bifurcé la buena recompensa github de @ daniel-smith y realicé algunas mejoras:

  • Ejemplo mejorado Actividad
  • Diseños mejorados
  • Método setItems fijo
  • Agregó divisores en items_list
  • Descartar los diálogos al hacer clic
  • Compatibilidad con elementos deshabilitados en los métodos setItems
  • listItem comentarios sobre el toque
  • Mensaje de diálogo desplazable

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

Vine con otra solución que maneja el estilo de sus diálogos en un lugar y no tiene que preocuparse cuando se aplica – diálogo mostrar / no se muestra, que puede causar un error (debe 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. * <p/> * 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 <T> */ public static <T extends OnDecoratedDialogShownListener> 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, pongo esto:

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

ColorPrimary enlaza a nuestro archivo colors.xml que almacena todos los colores. También d.setTitle proporciona una forma hacky para establecer el color del título.

  • EditText oculto por el teclado cuando android: gravity = "center" - Android
  • ¿Dónde puedo encontrar el archivo xml de configuración predeterminado de AlertDialog?
  • ¿Cómo puedo diseñar las pestañas de Android para obtener un aspecto 3D?
  • Sombra larga de Android TextView
  • Ver dentro de ScrollView no ocupa todo el lugar
  • Clasificadores de diseño de la pestaña Galaxy 10
  • NestedScrollView y CoordinatorLayout. Problema en desplazamiento
  • Una herramienta de desarrollo para diseñar una base de datos SQLite para Android
  • Cómo envolver los botones de imagen en un diseño lineal horizontal?
  • Simple gesto de desplazamiento a la actividad tutorial?
  • No se puede obtener elemento del diseño
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.