¿Cómo manejar texto largo en las preferencias de Android?

Fondo

Estoy haciendo una aplicación que tiene algunos ajustes, y quiero usar el construido en PreferenceActivity o PreferenceFragment para el trabajo

El problema

Algunas de las preferencias tienen un título largo que no puedo acortar, además creo que si alguna vez localizar la aplicación (traducir a varios idiomas) me enfrentaría al mismo problema (por ejemplo en alemán, que tiene palabras bastante largas, a veces).

Lo que se obtiene en esta situación es sólo el comienzo del texto y luego "…" (o menos puntos, que no tiene mucho sentido btw) en el final de la misma.

Ejemplo:

Introduzca aquí la descripción de la imagen

Lo que he intentado

Sé que el PreferenceActivity se extiende de ListActivity, así que puedo cambiar su adaptador a lo que deseo, pero eso quitaría la manera que trabaja.

También sé que puedo extender desde cada uno de los tipos de las clases de preferencias, usar el método "onCreateView" para tener una referencia a la vista creada y luego acceder a sus hijos, pero esto es extraño, ¿no? Quiero decir, es casi como asumir que nunca cambiará la forma en que se ve.

EDIT: Aquí hay un ejemplo de código de lo que he probado:

Extiéndase de cada una de las clases de preferencias, y en cada una de ellas, use:

... @Override protected View onCreateView(final ViewGroup parent) { final View view=super.onCreateView(parent); ViewUtil.handlePreferenceTitleTextView(view); return view; } ... //ViewUtil.java : private void handlePreferenceTitleTextView(final View v) { final TextView titleTextView=(TextView)v.findViewById(android.R.id.title); if(titleTextView!=null) titleTextView.setSingleLine(false); } 

Funciona, pero no creo que sea recomendable que Google cambie la forma en que funcionan las vistas de preferencias.

La pregunta

Cómo manejar textos largos en los títulos de las preferencias en Android?

¿Es posible hacer que tenga un ellipsize / marquee (para que tenga una animación para mostrar todo)? ¿O quizás auto ajuste el tamaño de la fuente? ¿O configurarlo para que contenga palabras? ¿O un scrollView horizontal que permitirá al usuario desplazarse para leer el resto del texto?

¿Existe quizás una convención de cómo manejar tales casos? Tal vez haga clic largo para mostrar una tostada / diálogo para ver todo el texto?

Esta es mi solución del problema para el caso específico de SwitchPreference y para una preferencia en general.

En primer lugar, debo tener en cuenta que para los niveles de API antes de 14 parece que los títulos de preferencia eran multilínea por defecto – por lo menos no vi ningún problema con títulos largos en Android 2.3.3. En las versiones más recientes de Android, este comportamiento ha cambiado al título forzado de una sola línea.

La solución es tweek el SwitchPreference o cualquier otro tipo de diseño de preferencias un poco.

En el archivo de pantalla de preferencias, añada el atributo android:layout para la preferencia requerida, por ejemplo:

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/prefs_category"> <SwitchPreference android:key="keyOfThePreference" android:title="@string/pref_title" android:switchTextOn="@string/pref_on" android:switchTextOff="@string/pref_off" android:summaryOn="@string/pref_enabled" android:summaryOff="@string/pref_disabled" android:layout="@layout/preference_multiline" /> ... 

A continuación, proporcione el preference_multiline.xml con un diseño alternativo. He utilizado una versión modificada de la preference.xml estándar.xml:

 <?xml version="1.0" encoding="utf-8"?> <!-- Layout for a Preference in a PreferenceActivity. The Preference is able to place a specific widget for its particular type in the "widget_frame" layout. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" android:paddingRight="?android:attr/scrollbarSize" android:background="?android:attr/selectableItemBackground" > <ImageView android:id="@+android:id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dip" android:layout_marginRight="6dip" android:layout_marginTop="6dip" android:layout_marginBottom="6dip" android:layout_weight="1"> <TextView android:id="@+android:id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="false" android:textAppearance="?android:attr/textAppearanceLarge" android:ellipsize="marquee" android:fadingEdge="horizontal" /> <TextView android:id="@+android:id/summary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@android:id/title" android:layout_alignLeft="@android:id/title" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary" android:maxLines="4" /> </RelativeLayout> <!-- Preference should place its actual preference widget here. --> <LinearLayout android:id="@+android:id/widget_frame" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="vertical" /> </LinearLayout> 

Aquí he cambiado deliberadamente android:singleLine valor en android:singleLine del título de true a false . Esto hace el trabajo.

Mi solución a esto era extender SwitchPreference y actualizar el título TextView dentro de onBindView(View view) . A continuación, puede utilizar esta preferencia personalizada en el archivo xml de sus preferencias.

 public class SwitchPreferenceMultiLine extends SwitchPreference { @SuppressWarnings("unused") public SwitchPreferenceMultiLine(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @SuppressWarnings("unused") public SwitchPreferenceMultiLine(Context context, AttributeSet attrs) { super(context, attrs); } @SuppressWarnings("unused") public SwitchPreferenceMultiLine(Context context) { super(context); } @Override protected void onBindView(View view) { super.onBindView(view); ((TextView) view.findViewById(android.R.id.title)).setSingleLine(false); } } 
  • Cómo insertar texto extraíble
  • Añadir nuevo carácter de línea en cadena
  • Cómo configurar la fuente personalizada para palabra en un texto TextView
  • Android: setText () para TextView en PopupWindow no funciona
  • Android-TextView setText en Html.fromHtml para mostrar la imagen y el texto
  • TextView diferentes formas de añadir dibujable
  • ¿Cómo auto-ajustar el tamaño del texto en un TextView multi-línea de acuerdo con la vista de las dimensiones máximas?
  • Desplazamiento de un TextView a una línea específica
  • Escala automática TextView Text para ajustar dentro de límites
  • ¿Qué es TextView Gravity de forma predeterminada?
  • Problema al usar una fuente personalizada - "no se puede hacer el tipo de letra nativo"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.