¿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 ?
- Botón de Toggle de Android tamaño personalizado / relleno / espaciado
- Problema de diseño: ¿cómo colocar algo en la parte superior e inferior?
- Diseño general de la aplicación (IntentService / ContentProvider / AsyncTask)
- Desactivación del botón de Android si los campos de texto están vacíos
- Deshabilitar icono colorStateList en NavigationView
Nota: no quiero usar un diseño personalizado
- Programatically cambiar la altura del diseño, ClassCastException?
- Aplicación multi-pantalla para Android
- Disposición de Android con ListView y botones
- Android: ¿cómo tener este tipo de selección de tiempo?
- Cómo obtener el ancho en píxeles de vista con android: layout_width = "wrap_content"?
- Importar nueva biblioteca de soporte de diseño de Android
- SQLiteOpenHelper vs ContentProvider
- Android detecta instanceof EditText y instanceof TextView como el mismo
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!
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.
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" />
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
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.
- Restaurar el estado de TextView después de la rotación de la pantalla?
- Obtener la distancia entre dos puntos geográficos