¿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).
- Resaltar Textview con EditText
- ¿Justificar texto en una aplicación de Android utilizando un WebView pero presentando una interfaz similar a TextView?
- Sobreponiendo problema en Android TextView
- Vista de texto de Android sobre imagen con fondo transparente
- Por qué mi invocación de Canvas.drawText () simplemente no funciona
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:
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?
- Tools: text para artículos de RecyclerView
- Dibuja un personaje con 2 colores en Android
- Mostrar vista en toda mi aplicación
- Android: crea TextView (o EditText) de forma programática y lo configura en un lugar específico de la pantalla dando coordenadas
- Cómo establecer programaticamente maxLength en Android TextView?
- Establecer eventos onclick en la vista de texto creada mediante programación
- Cómo ajustar texto a la siguiente línea en un Android TextView?
- Fuente urdu en la vista de 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); } }
- Android Polimorfismo: Anti-Patrón?
- Es posible liberar una aplicación actualizada mediante la firma con un certificado diferente de la que se utilizó originalmente