Spanish SOLUCIONADO¿Puede averiguarse alto de WebView para mostrar todo el conten. sin tener que desplazar?

Seneca

Active Member
Licensed User
Hola.

Hasta ahora usaba un Label para mostrar texto plano que extraía de una BD. Como este texto va cambiando de forma dinámica a lo largo del tiempo, usaba el miembro MeasureMultilineTextHeight de la StringUtils para determinar el alto del Label necesario para que me mostrase todo el texto.

Como a partir de ahora el texto que me aportará la BD va a ser HTML, voy a sustituir el Label por un WebView (como bien me han aconsejado en este hilo). El problema que ahora me surge es que no encuentro la manera de averiguar el alto del WebView necesario para que me muestre todo el contenido HTML, sin tener que recurrir al desplazamiento vertical dentro del mismo, de manera similar a lo que hacía con el Label.

¿Es posible hacerlo de alguna manera?

El efecto que quiero conseguir es el siguiente:

WebView.jpg


Gracias.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User

Seneca

Active Member
Licensed User
Hola.

@bgsoft eres un pozo de sabiduría. Gracias por compartirla.

He echado en falta un ejemplo de uso en el hilo de la librería, pero lo que necesito creo que lo tengo resuelto.

Parece ser que: getContentHeight * getScale = height del webview. Pero por otro lado se indica que getScale está en desuso desde API 17. Aún así lo he probado en una móvil con API23 y el cálculo del height del webview me lo hace correctamente. Como no he encontrado nada alternativo, empezaré a usarlo así.

B4X:
Dim wvInfo As WebView
Dim wveInfo As WebViewExtras
Dim infoHTML as String 'En esta variable introduzco el código HTML a publicar y que en mi caso lo extraigo de una BD

wvInfo.LoadHtml("<html><body>" & infoHTML & "</body></html>") 'Como el código extraido de la BD no incorpora las etiquetas HTML y BODY, las añado en este momento
wvInfo.Height = wveInfo.GetContentHeight(wvInfo) * wveInfo.GetScale(wvInfo)

Saludos.
 
Last edited:

Seneca

Active Member
Licensed User
Hola.

Mi gozo en un pozo. He venido haciendo pruebas satisfactorias en cuanto al cálculo del height del WebView. Pero he comprobado que solo me funciona si ejecuto paso a paso en modo Debug. Cuando ejecuto "del tirón", el cálculo del height es igual a cero. Pongo un ejemplo:

B4X:
Sub Activity_Create(FirstTime As Boolean)
 
    Activity.LoadLayout("webview1")
 
    infoHTML = "<html><body>Lorem ipsum dolor sit amet, consectetuer <n>adipiscing elit</n>. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet</body></html>"

    wvInfo.LoadHtml(infoHTML)
    label1.Text = "Height: " & wveInfo.GetContentHeight(wvInfo) & " - Scale: " & wveInfo.GetScale(wvInfo)

End Sub


Creo que lo que ocurre es que el LoadHtml tarda un tiempo en completarse (a pesar de que el código a publicar es muy básico), y cuando se ejecuta la siguiente línea ( wveInfo.GetContentHeight(wvInfo) ) aún no está listo para que pueda calcularse el height.

No sé si habrá otra solución mejor, pero la que he encontrado es calcular el height del WV en el evento pagefinished. En el ejemplo adjunto puede verse.

B4X:
Sub wvinfo_pagefinished (url As String)

    label2.Text = "Height: " & wveInfo.GetContentHeight(wvinfo) & " - Scale: " & wveInfo.GetScale(wvinfo)

End Sub



Saludos.
 

Attachments

  • Ejemplo_height_webview.zip
    8.3 KB · Views: 229
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Séneca:

Si, es lógico que hasta que no cargue la página no te de esa información. Asi que es buena esa solución, podrias hacer un Sleep(n) pero entonces dependerá del procesador y del tamaño del texto, por lo tanto la mejor opción es esa.

Si no quieres que el WebView cambie de tamaño mientras carga, lo puedes hacer invisible y en el evento lo cambias de tamaño y lo haces visible. Yo en las cargas de las paginas web hago un ProgressDialogShow cuando la cargo, y luego lo quito cuando ha acabado la carga, asi informo al usuario por si la página es muy larga.

Saludos
 

Seneca

Active Member
Licensed User
Si no quieres que el WebView cambie de tamaño mientras carga, lo puedes hacer invisible y en el evento lo cambias de tamaño y lo haces visible. Yo en las cargas de las paginas web hago un ProgressDialogShow cuando la cargo, y luego lo quito cuando ha acabado la carga, asi informo al usuario por si la página es muy larga.

Hola.

Como lo que voy a mostrar en el WV no es una web, sino texto enriquecido sacado de una BD local, el tiempo en mostrar el contenido es mínimo. Aún así implementaré el cambio a visible en el evento Finished, tal como me recomiendas.

Gracias.
 

Seneca

Active Member
Licensed User
Hola.

Como lo que voy a mostrar en el WV no es una web, sino texto enriquecido sacado de una BD local, el tiempo en mostrar el contenido es mínimo. Aún así implementaré el cambio a visible en el evento Finished, tal como me recomiendas.

Gracias.

Hola.

Supongamos que parto de un WV invisible. Pues resulta que si hago visible el WV dentro del evento _pagefinished, el WV.height se calcula incorrectamente. Ahora bien, si el WV lo hago visible justo después del .LoadHtml (antes de que salte el evento anterior) entonces sí que se calcula correctamente.

Esto lo comento a modo de curiosidad, ya que no me resulta un problema.

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Séneca:

Creo que habria otra solucion, poner el WV fuera de la pantalla pero visible (valor negativo por ejemplo), y luego bajarlo a su sitio. Este "truco" me ha funcionado con alguos objetos.

Saludos
 

Seneca

Active Member
Licensed User
Hola.

Como lo que muesto en el WV son solo unas lineas de texto enriquecido desde una BD local, el llenado y dimensionado del WV es rapidísimo y no da mala impresión. Aún así, me anoto tu sugerencia porque más adelante necesitaré rellenar otros WV con contenido web y me será útil estas ideas que aportas.

Gracias por el interés.

Saludos.
 
Top