Índice
En un artículo anterior vimos cómo crear un diálogo personalizado en las preferencias para android. Continuaremos con esa aplicación trivial a modo de ejemplo para ver cómo personalizar el summary que aparece debajo del título de una preferencia.
Obteniendo el Layout por defecto
Al principio, obtuve el TextView que representa el summary, pero cambiarle el color no tenía efecto y se quedaba de color gris. La solución final consistió en crear un propio layout. Buscando en el código fuente de Android lo encontré en frameworks/base/core/res/res/layout/preference_child.xml. A éste recurso hay que quitarle unas cuantas cosas que no nos sirven, quedando así:
<?xml version="1.0" encoding="utf-8"?>
<!-- Layout for a visually child-like Preference in a PreferenceActivity. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingEnd="?android:attr/scrollbarSize"
android:paddingStart="16dip" >
<RelativeLayout
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_marginBottom="6dip"
android:layout_marginEnd="6dip"
android:layout_marginTop="6dip"
android:layout_weight="1" >
<TextView
android:id="@+android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@android:id/title"
android:layout_below="@android:id/title"
android:maxLines="4"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />
</RelativeLayout>
</LinearLayout>
Layout para mostrar el error
El layout anterior es el que se usará por defecto, cuando queramos resaltar un error usaremos otro exáctamente igual pero con el color del Summary cambiado, como es repetir código simplemente se muestra el nombre del fichero y el cambio en el TextView con ID @android:id/summary:
preference_child_summary_error.xml
<!-- ... -->
android:textColor="@color/red"
<!-- ... -->
La definición del color se declara en un archivo dentro de la carpeta values: ./res/values/colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="red">#ff0000</color>
</resources>
Cambiar el color en tiempo de ejecución
Ahora que tenemos el diseño listo, veremos cómo cambiarlo cuando ocurra cierta condición. En el caso que nos ocupa necesitaremos resaltar el summary en color rojo cuando el usuario introduzca una contraseña que no cumple con los requisitos establecidos por la aplicación, el código quedará algo así:
if (newValue.toString().length() <= 8) {
mDialogoPersonalizado.setLayoutResource(R.layout.preference_child_summary_error);
mDialogoPersonalizado.setSummary("Mensaje de error");
} else {
mDialogoPersonalizado.setLayoutResource(R.layout.preference_child);
mDialogoPersonalizado.setSummary("********");
mEditorDialogoPerso.putString("diagPerso", passw);
mPasswordDialogoPerso = passw;
mEditorDialogoPerso.commit();
}
Como se vio en el anterior artículo, mDialogoPersonalizado
es de tipo Preference
. Cuando se introduzca una contraseña inferior a 8 caracteres, se mostrará el mensaje como aparece en la imagen:
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.