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><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">
</textview></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:

Índice