Obtención de la altura de la vista de texto antes de la representación en el diseño

No se pudo encontrar ninguna solución buena que calcula la altura de la vista de texto donde se estableció el texto antes de convertir el texto en el diseño. Cualquier ayuda por favor

4 Solutions collect form web for “Obtención de la altura de la vista de texto antes de la representación en el diseño”

2 soluciones

Usó la solución 1 al principio y encontró la solución 2 más adelante. Ambos trabajan, es realmente lo que prefieres.

Importante es asegurarse de que tiene todas las dimensiones desde la derecha, ya que la mezcla de tamaños de fuente en sp o px dará una gran diferencia dependiendo de qué pantalla se prueba.

Un proyecto de ejemplo muy básico está disponible en https://github.com/hanscappelle/SO-3654321

Solución 1 utilizando TextView y MeasureSpec

El problema principal con la pregunta original es TextView en el método debajo debe ser configurado como nuestro TextView que debe ser prestado a la disposición. Creo que esta solución es valiosa para muchas personas que se enfrentan a este problema.

public static int getHeight(Context context, CharSequence text, int textSize, int deviceWidth, Typeface typeface,int padding) { TextView textView = new TextView(context); textView.setPadding(padding,0,padding,padding); textView.setTypeface(typeface); textView.setText(text, TextView.BufferType.SPANNABLE); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize); int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); textView.measure(widthMeasureSpec, heightMeasureSpec); return textView.getMeasuredHeight(); } 

Y un ejemplo de cómo usar esto:

 // retrieve deviceWidth int deviceWidth; WindowManager wm = (WindowManager) textView.getContext().getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){ Point size = new Point(); display.getSize(size); deviceWidth = size.x; } else { deviceWidth = display.getWidth(); } // the text to check for String exampleTextToMeasure = "some example text that will be long enough to make this example split over multiple lines so we can't easily predict the final height"; // some dimensions from dimes resources to take into account int textSize = getContext().getResources().getDimensionPixelSize(R.dimen.text_size); int padding = getContext().getResources().getDimensionPixelSize(R.dimen.text_padding); // final calculation of textView height int measuredTextHeight = getHeight(getContext(), exampleTextToMeasure, textSize, deviceWidth, TypeFace.DEFAULT, padding); 

Solución 2 utilizando TextPaint y StaticLayout

Este método se basa en un TextPaint y StaticLayout que también da resultados fiables en todos los niveles de API que he probado hasta ahora. Preste buena atención a las unidades de dimensiones; Todos deben estar en píxeles!

Fuente: Medición de altura de texto a dibujar en lienzo (Android)

  public static int method1UsingTextPaintAndStaticLayout( final CharSequence text, final int textSize, // in pixels final int deviceWidth, // in pixels final int padding // in pixels ) { TextPaint myTextPaint = new TextPaint(); myTextPaint.setAntiAlias(true); // this is how you would convert sp to pixels based on screen density //myTextPaint.setTextSize(16 * context.getResources().getDisplayMetrics().density); myTextPaint.setTextSize(textSize); Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL; float spacingMultiplier = 1; float spacingAddition = padding; // optionally apply padding here boolean includePadding = padding != 0; StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, deviceWidth, alignment, spacingMultiplier, spacingAddition, includePadding); return myStaticLayout.getHeight(); } 

Desde la respuesta de support_ms, hay un método más sencillo que toma sólo un TextView como parámetro.

 /** * Get the TextView height before the TextView will render * @param textView the TextView to measure * @return the height of the textView */ public static int getTextViewHeight(TextView textView) { WindowManager wm = (WindowManager) textView.getContext().getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int deviceWidth; if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){ Point size = new Point(); display.getSize(size); deviceWidth = size.x; } else { deviceWidth = display.getWidth(); } int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); textView.measure(widthMeasureSpec, heightMeasureSpec); return textView.getMeasuredHeight(); } 

Buena respuesta de @support_ms, pero no estoy seguro del punto de crear un nuevo TextView y trabajar con todos estos parámetros de entrada cuando se podría simplemente formatear su TextView primero y luego llamar al método estático con un solo parámetro, el propio TextView !

También no estoy seguro de por qué un parámetro fue etiquetado deviceWidth sólo uso el ancho de la propia Textview . El mío era match_parent y supongo que cualquier TextView con wrap_content puede no funcionar en absoluto. Pero eso es lo que obtienes.

 public static int getHeight(TextView t) { int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(screenWidth(t.getContext()), View.MeasureSpec.AT_MOST); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); t.measure(widthMeasureSpec, heightMeasureSpec); return t.getMeasuredHeight(); } public static int screenWidth(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); return display.getWidth(); } 

Aquí está mi solución fácil su obtener el tamaño antes de ser pintado

https://stackoverflow.com/a/40133275/1240672

  • El fondo de TextView se está estirando
  • Calcular el tamaño del texto según el ancho del área de texto
  • Spannable Vs Tipo Vs Html
  • TextView envuelve el texto después de cambiar el tipo de letra
  • Cómo cambiar el color de fondo de un TextView con un color definido en mi archivo de valores / colors.xml?
  • ¿Cómo puede mostrar texto al revés con una vista de texto en Android?
  • Ocultar TextView después de algún tiempo en Android
  • TextView en android sólo muestra dos líneas de texto en cualquier orientación
  • ¿Cómo hacer que el texto se mueva de izquierda a derecha en Android?
  • Vista lateral con XML Android
  • Actualizar Android TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.