¿Cuánto texto se puede establecer en TextView, para que no tenga que desplazarse

Cuánto texto se puede establecer en la vista de texto para una cadena de texto en particular con una fuente y un tamaño particulares, de modo que la vista de texto no tenga que desplazarse. Quiero decir cuánto texto puede caber dentro de un TextView, sin la necesidad de desplazamiento. Esto es similar a ¿Cómo puedo determinar cuánto texto cabrá en un TextView en Android? , Pero no soy capaz de encontrar una solución de trabajo. Por favor ayuda.

Asumiendo que ya has buscado otras opciones y no hay una manera fácil de hacer esto, aquí está un enfoque teórico (no lo he probado) hacking que podría funcionar.

Cree una nueva clase que extienda TextView. A continuación, anule un método que se llamaría después de que se haya actualizado el contenido de TextView. Puede haber un mejor método para usar, pero para este ejemplo vamos a intentar onDraw (). Este método verificará los anchos y verá si necesita poder desplazarse. Si es así, recortaría la cadena y establecería el texto. Lo haría en un bucle hasta que no tuviera que desplazarse por más tiempo.

@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(getWidth() < computeHorizontalScrollRange()){ // Requires scrolling, the string is too long // Do whatever you need to do to trim the string, you could also grab the remaining string and do something with it. // Set the TextView to use the trimmed string. } } 

Usted quisiera cerciorarse de que no consiguiera en un lazo sin fin y también compruebe si el ancho es cero.

Usted también puede mirar las varias opciones del android:ellipsize .

Realmente necesitaba algo similar. Necesitaba un ancho de TextView un tamaño semi fijo pero el texto siempre era necesario para encajar allí. Como el tamaño realmente no importa, creé una vista que cambia el tamaño del texto hasta que encaje.

 import android.content.Context; import android.util.AttributeSet; import android.util.TypedValue; import android.widget.TextView; /** * The text inside this TextView will resize to fit. * It will resize until it fits within the view and padding */ public class FitTextView extends TextView { private float defaultSize = 12; public FitTextView(Context context) { super(context); } public FitTextView(Context context, AttributeSet attrs) { super(context, attrs); defaultSize = getTextSize(); } public FitTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); defaultSize = getTextSize(); } /** * Set the default size. This size is set every time the * view is resized. * @param size */ public void setDefaultSize(float size) { defaultSize = size; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { setTextSize(TypedValue.COMPLEX_UNIT_PX, defaultSize); fitCharsInView(); super.onSizeChanged(w, h, oldw, oldh); } @Override public void setText(CharSequence text, BufferType type) { fitCharsInView(); super.setText(text, type); } /** * Decreases the text size until it fits inside the view */ public void fitCharsInView() { int padding = getPaddingLeft() + getPaddingRight(); int viewWidth = getWidth() - padding; float textWidth = getTextWidth(); int iKillInfite = 0; int maxIteration = 10000; while(textWidth > viewWidth && iKillInfite < maxIteration) { iKillInfite++; float textSize = getTextSize(); setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize-1); textWidth = getTextWidth(); } } /** * Gets the width in pixels of the text * @return */ private float getTextWidth() { return getPaint().measureText(getText().toString()); } } 

Esta es sólo una tormenta cerebral rápida de la mía:

  1. Medir la longitud del texto en caracteres
  2. Obtener las dimensiones de pantalla y la información de densidad
  3. Obtener tamaño de fuente, altura de línea
  4. Calcula la cantidad aproximada de espacio que ocupará la cadena dada teniendo en cuenta los datos anteriores
  5. Dividir la cuerda en consecuencia

TextView clase TextView y anularía el método onLayout() para recortar la cadena siempre y cuando la altura medida sea mayor que computeHorizontalScrollRange() .

Creo que la solución es un poco mejor porque:

  1. Sólo ajusta el texto una vez (cuando se está creando la vista);
  2. Usted puede almacenar fácilmente el texto "recortado" si desea restaurarlo en el futuro;
  3. OOP es impresionante.
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.