¿Por qué el atributo minHeight no funciona en WebView Android?

Esta pregunta ya se ha hecho aquí , pero no tiene solución.

Tengo un WebView . Quiero establecer la altura mínima para el objeto WebView utilizando minHeight , pero no funciona. El mismo atributo funciona para Button.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.anshul.webview.WebActivity"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="400dp"></WebView> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:minHeight="150dp" android:text="This is a Button. It's minHeight is set to 150 dp and it works !!"/> 

Claramente de la imagen de abajo, el WebView no está apoyando el atributo minHeight . ¿Alguien sabe una solución para este problema?

Introduzca aquí la descripción de la imagen

En primer lugar, vamos a entender cómo el uso de otras vistas android:minHeight atributo android:minHeight . Tomemos Spinner por ejemplo. En AbsSpinner#onMeasure() que codificamos ver el siguiente fragmento de código:

 ... preferredHeight = Math.max(preferredHeight, getSuggestedMinimumHeight()); preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth()); heightSize = resolveSizeAndState(preferredHeight, heightMeasureSpec, 0); widthSize = resolveSizeAndState(preferredWidth, widthMeasureSpec, 30); setMeasuredDimension(widthSize, heightSize); ... 

Por lo tanto, getSuggestedMinimumHeight() debe considerarse al calcular la altura preferida.

Ahora, veamos cómo se está midiendo WebView .

  • WebView#onMeasure() delega el trabajo a WebViewChromium#onMeasure()
  • WebViewChromium#onMeasure() delega el trabajo a AwContents#onMeasure()
  • AwContents#onMeasure() delega el trabajo a AwLayoutSizer#onMeasure

AwLayoutSizer es el último componente que es responsable de medir WebView y podemos ver claramente que su onMeasure() no respeta el valor getSuggestedMinimumHeight() .

No estoy seguro de si este es un comportamiento intencionado o no. Sin embargo, no puedo encontrar suficientes costuras para afectar de algún modo ese proceso de medición. Aquí está el chuck de código en la clase WebView , donde se inicializa el objeto que eventualmente devolverá WebViewChromium (el primer paso en el orden mencionado anteriormente).

private void ensureProviderCreated() { checkThread(); if (mProvider == null) { // As this can get called during the base class constructor chain, pass the minimum // number of dependencies here; the rest are deferred to init(). mProvider = getFactory().createWebView(this, new PrivateAccess()); } }
private void ensureProviderCreated() { checkThread(); if (mProvider == null) { // As this can get called during the base class constructor chain, pass the minimum // number of dependencies here; the rest are deferred to init(). mProvider = getFactory().createWebView(this, new PrivateAccess()); } } 

Como se puede ver, esto no es algo que se puede personalizar o cambiar fácilmente.

Creo que las dimensiones de la webview funcionan más según las propiedades del puerto de vista de contenido …

Consulte https://developer.android.com/guide/webapps/targeting.html#Viewport

La ventana gráfica es el área en la que se dibuja su página web. Aunque el área visible total de la ventana gráfica coincide con el tamaño de la pantalla cuando se amplía completamente, la ventana de visualización tiene sus propias dimensiones de píxeles que pone a disposición de una página web. Por ejemplo, aunque una pantalla de dispositivo puede tener una anchura física de 480 píxeles, la ventana de visualización puede tener un ancho de 800 píxeles. Esto permite que una página web diseñada en 800 píxeles de ancho para ser completamente visibles en la pantalla cuando la escala de la ventana es 1,0. La mayoría de los navegadores web de Android (incluido Chrome) establecen la ventana gráfica de forma predeterminada en un tamaño grande (conocido como "modo de vista ampliada" con una anchura aproximada de 980 px). Muchos navegadores también alejan lo más posible, de forma predeterminada, para mostrar el ancho completo de la ventana de visualización (conocido como "modo de vista general").

Use constraint layout. Que ayudará a resolver todos estos tipos de errores y muy fácil de usar.

Si su versión de estudio de Android está por debajo de 2.3.1 a continuación, agregue esta dependencia.

 compile 'com.android.support.constraint:constraint-layout:1.0.0-beta1' 

Intentalo :

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webView = (WebView)findViewById(R.id.webView); webView.loadDataWithBaseURL(null, "<html><body bgcolor=\"#E6E6FA\"> hehehe </body></html>", "text/html", "utf-8", null); } <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:background="@color/blue" android:layout_height="match_parent"> <LinearLayout android:minHeight="300dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentStart="true" > <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:minHeight="150dp" android:text="This is a Button. It's minHeight is set to 150 dp and it works !!"/> </RelativeLayout> 

Introduzca aquí la descripción de la imagen

  • Indicador de actividad de cliente de webview android
  • Vídeo con iframe no se muestra en la vista web de Android
  • Java.lang.NullPointerException en android.webkit.WebViewClassic.setBaseLayer (WebViewClassic.java:5377)
  • Android - Utilice OkHttp con Webview
  • Inconsistencias con el video HTML5 en un WebView de Android
  • Inicio y fin de solicitudes de registro HTTP desde WebView incorporado de Android
  • Forzar el no-flash Vimeo incrustar o deshabilitar Flash en un WebView?
  • Renderizar archivos epub en android
  • WebView java.lang.SecurityException: No hay permiso para modificar el hilo dado
  • ¿Cuáles son los formatos de archivo en el directorio de caché de Android WebView (data_1, f_000001 etc.)?
  • Cómo obtener la actividad de vista Web para desaparecer con PDF Link Action_view
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.