2011-02-06 5 views
6

Tengo un texto que se pondrá en un TextView. Lo hice usando setText().Obtenga la altura de un TextView

Ahora necesito encontrar el número de líneas o la altura que ocupa el texto en el TextView. Intenté usar getHeight(), pero siempre devuelve 0.

¿Hay alguna forma de obtener el alto del texto presente en el TextView?

+1

No se puede obtener el alto de una vista hasta que se haya procesado, es por eso que siempre se devuelve 0 si se está comprobando la altura justo después de configurar el texto. ¿Por qué necesitas saber la altura? Por favor explica más sobre lo que estás tratando de lograr. –

+0

en realidad tengo que desarrollar una aplicación que muestre el texto y las imágenes (como un lector de libros electrónicos) página por página (me refiero a que no debe contener ninguna barra de desplazamiento) ... así que cuando tenga una gran cantidad de texto para poner, Necesito saber cuánto ocupa el texto en la pantalla para que quepa en la pantalla. –

Respuesta

6

Como Juan señaló, no será capaz de obtener la altura inmediatamente después setText. No estoy seguro de que el uso de getHeight() en el TextView en sí te sirva de mucho. La altura de la vista no solo depende de la altura del texto visible en la vista, sino también del grupo de vistas/diseño en el que reside TextView. Si el grupo de vistas le dice a TextView que maximice la altura, getHeight() no te llevará a ninguna parte si esperas hasta después de que se represente el texto.

veo un número de maneras en que esto se podría hacer:

  1. TextView subclase y sobreescribir el método onSizeChanged. Allí, llame a supers enSizeChanged, luego obtenga el número de líneas dentro de TextView por getLineCount() y la altura por línea con getLineHeight(). Esto podría o no ser mejor que usar getHeight(), dependiendo de su diseño o lo que sea.
  2. No utilice las dimensiones de Textviews. Obtenga TextViews Paint con TextView.getPaint() y luego calcule el ancho y el alto desde

    Rect bounds; paint.getTextBounds (texto, 0, text.length(), límites);

Ahora tendrá las dimensiones dentro de los límites. Ahora puede trabajar con paint.breakText para ver la cantidad de texto que cabe en una línea. Probablemente demasiada molestia y no está garantizado (para mi ojo no entrenado) que sea la misma lógica que usa TextView.

+0

Kread ..¿Puedes dar algún ejemplo de cómo subclasificar el TextView para que el objeto TextView presente en la clase principal pueda usarse en la subclase –

+0

? Bien, tienes clase pública MyText extiende TextView {ANULA MÉTODOS AQUÍ} y en la clase principal haces " MyText textView = new MyText (this); " en lugar de "TextView textView = new TextView (this);". Si desea utilizar diseños XML en su lugar, le recomiendo que lea http://developer.android.com/guide/topics/ui/custom-components.html (De hecho, lea eso incluso para crear cosas en Java). –

+0

Thnks ... pero el método onSizeChanged se llamará al final. por lo tanto, getLineCount no se puede utilizar en el medio de la aplicación. Es decir ... si quiero inicializar una variable con textview.getLineCount(), el valor de la variable es 0 hasta el final, incluso después de configurar el texto –

13

Como este tamaño se conoce solo después de que se finaliza el diseño, una forma es crear una vista de texto personalizada y utilizar el método onSizeChanged. Otra forma es la siguiente:

final TextView tv = (TextView) findViewById(R.id.myTextView); 
    ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      Toast.makeText(MyActivity.this, tv.getWidth() + " x " + tv.getHeight(), Toast.LENGTH_LONG).show(); 
      tv.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
    }); 

Este código que he encontrado aquí: How to retrieve the dimensions of a view?

+0

Supongo que puedo obtener algo útil de esto ... thnq .. –

+0

El problema con el código anterior es que ... la altura de la vista de texto solo se puede lograr al final del código ... ¡no puedo obtenerlo en el medio! Tomé una variable para almacenar la altura e inicié la variable con tv.getHeight() en onGlobalLayout() .. pero el valor de la variable es siempre 0 hasta el final ... al final cambia a la altura del texto ... –

+0

Funciona ... gracias @Lumis – John

Cuestiones relacionadas