Vista web de Android: la página web debe ajustarse a la pantalla del dispositivo

103

He intentado lo siguiente para ajustar la página web según el tamaño de la pantalla del dispositivo.

mWebview.setInitialScale(30);

y luego configura la ventana gráfica de metadatos

<meta name="viewport" content="width=320, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=0;"/>
<meta name="viewport" content="width=device-width, target-densityDpi=medium-dpi"/>

Pero nada funciona, la página web no está fijada al tamaño de la pantalla del dispositivo.

¿Alguien puede decirme cómo conseguir esto?

SWDeveloper
fuente

Respuestas:

82

Debe calcular la escala que debe usar manualmente, en lugar de establecerla en 30.

private int getScale(){
    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    int width = display.getWidth(); 
    Double val = new Double(width)/new Double(PIC_WIDTH);
    val = val * 100d;
    return val.intValue();
}

Entonces usa

WebView web = new WebView(this);
web.setPadding(0, 0, 0, 0);
web.setInitialScale(getScale());
danh32
fuente
7
Gracias por tu respuesta, tienes razón, funciona. pero tengo un problema diferente. No estoy cargando una imagen, cargando la página web en la vista web. Entonces, ¿cómo averiguar el ancho de la página web (PIC_WIDTH)?
SWDeveloper
1
Ah, extrañaba esa constante allí. Lo siento por eso. No estoy seguro de cómo puede obtener el ancho de la página web real.
danh32
54
¿Qué es PIC_WIDTH aquí?
Paresh Mayani
4
PIC_WIDTH era una constante que conocía de antemano, ya que solo estaba mostrando una sola imagen de la carpeta de activos. Como dije anteriormente, no sé cómo puede obtener el ancho de la página web real.
danh32
1
@MaheshwarLigade uso PIC_WIDTH = 360
Nicholas Ng
292

Puedes usar esto

    WebView browser = (WebView) findViewById(R.id.webview);
    browser.getSettings().setLoadWithOverviewMode(true);
    browser.getSettings().setUseWideViewPort(true);

esto corrige el tamaño según el tamaño de la pantalla.

Tushar Vengurlekar
fuente
4
Esto apoya la pantalla pero ya no le permite hacer zoom in / out. ¿Podría mejorar este problema? Sé que es posible en IOS.
AlexAndro
1
esta configuración funciona para mí pero solo para el ancho, en los mismos casos ahora está cortando la altura
albanx
1
Esta es la mejor solución para lograrlo que he encontrado hasta ahora.
fragon
1
El hecho de que la solución esté integrada realmente me convence.
Daniel Handojo
3
Para agregar zoom, agregue lo siguiente: webview.getSettings (). SetBuiltInZoomControls (true); webview.getSettings (). setDisplayZoomControls (falso);
Andrew
34

Amigos,

Encontré mucha información importante y excelente de usted. Pero, la única forma en que funciona para mí fue de esta manera:

webView = (WebView) findViewById(R.id.noticiasWebView);
webView.setInitialScale(1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(false);
webView.loadUrl("http://www.resource.com.br/");

Estoy trabajando en Android 2.1 por el tipo de dispositivos de la empresa. Pero arreglé mi problema usando la parte de información de cada uno.

¡Gracias!

Josmar Peixe
fuente
Entonces el zoom ya no funciona. ¿Soy el único con este problema?
prueba el
@testing, ¿obtuviste alguna solución?
Anshul Tyagi
@AnshulTyagi: No, no lo hice. Como era un proyecto de prueba para mí, no investigué más sobre esto. ¡Avísame si encuentras algo!
prueba el
@AnshulTyagi: Para las páginas web, este enfoque me funciona. Para las imágenes tengo que usar algo diferente ...
prueba
31

Estas configuraciones funcionaron para mí:

wv.setInitialScale(1);
wv.getSettings().setLoadWithOverviewMode(true);
wv.getSettings().setUseWideViewPort(true);
wv.getSettings().setJavaScriptEnabled(true);

setInitialScale (1) faltaba en mis intentos.

Aunque la documentación dice que 0 se alejará por completo si setUseWideViewPort se establece en verdadero, pero 0 no funcionó para mí y tuve que establecer 1 .

Doc
fuente
1
No estaba estableciendo la escala inicial, y me funcionó durante años. (Estaba configurando el modo de vista general y la ventana gráfica). Pero un nuevo dispositivo con el que me acabo de encontrar pareció comenzar a acercarse hasta que la página se actualizó. Establecer la escala inicial solucionó esto para mí.
Doomsknight
25

Prueba con estos consejos de HTML5

http://www.html5rocks.com/en/mobile/mobifying.html

Y con esto si tu versión de Android es 2.1 o superior

  WebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
josebetomex
fuente
2
desafortunadamente, desaprobaron esto y esta solución me estaba fallando en Galaxy S5
2cupsOfTech
15

Todo lo que necesitas hacer es simplemente

webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
Muhammad Aamir Ali
fuente
13

Estos funcionan para mí y ajustan el WebView al ancho de la pantalla:

// get from xml, with all size set "fill_parent"  
webView = (WebView) findViewById(R.id.webview_in_layout);  
// fit the width of screen
webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); 
// remove a weird white line on the right size
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);  

Gracias por encima de los avisos y la línea blanca en la vista web de eclipse

Nezneika
fuente
3
Parece que SINGLE_COLUMN está obsoleto ahora developer.android.com/reference/android/webkit/…
Alexander Abramov
11

Tengo el mismo problema cuando uso este código

webview.setWebViewClient(new WebViewClient() {
}

por lo que puede ser que deba eliminarlo en su código
y recuerde agregar 3 modos a continuación para su vista web

    webview.getSettings().setJavaScriptEnabled(true);  
    webview.getSettings().setLoadWithOverviewMode(true);
    webview.getSettings().setUseWideViewPort(true);

esto corrige el tamaño según el tamaño de la pantalla

Linh
fuente
2
@shahzainali, ¿puedes hacer zoom en tu vista web?
Anshul Tyagi
@AnshulTyagi No, no hace zoom.
shahzain ali
6
WebView browser = (WebView) findViewById(R.id.webview);
browser.getSettings().setLoadWithOverviewMode(true);
browser.getSettings().setUseWideViewPort(true);
browser.getSettings().setMinimumFontSize(40);

Esto funciona muy bien para mí ya que el tamaño del texto se ha establecido en muy pequeño por .setLoadWithOverViewMode y .setUseWideViewPort.

Steve
fuente
6

Tenía un video en una cadena html y el ancho de la vista web era mayor que el ancho de la pantalla y esto me funciona.

Agregue estas líneas a la cadena HTML.

<head>
<meta name="viewport" content="width=device-width">
</head>

Resultado después de agregar el código anterior a la cadena HTML:

<!DOCTYPE html>
<html>

<head>
<meta name="viewport" content="width=device-width">
</head>


</html>
Biljana Divljak
fuente
5

Tienes que usar HTML en tu webView en este caso. Resolví esto usando el siguiente código

webView.loadDataWithBaseURL(null,
                "<!DOCTYPE html><html><body style = \"text-align:center\"><img src= "
                        + \"http://www.koenvangorp.be/photos/2005_09_16-moon_2000.jpg\"
                        + " alt=\"pageNo\" width=\"100%\"></body></html>",
                "text/html", "UTF-8", null);
Qadir Hussain
fuente
Supongo que es mejor usar px ot vh en lugar de%. % en iframes tiene algunos errores en los cambios de orientación
Siarhei
4

Realización de cambios en la respuesta de danh32 desde display.getWidth (); ahora está en desuso.

private int getScale(){
    Point p = new Point();
    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    display.getSize(p);
    int width = p.x; 
    Double val = new Double(width)/new Double(PIC_WIDTH);
    val = val * 100d;
    return val.intValue();
}

Entonces usa

WebView web = new WebView(this);
web.setPadding(0, 0, 0, 0);
web.setInitialScale(getScale());
Cuentos de pato
fuente
Calculé que la escala debería ser <1 o 100%, así que comparé mi ancho con PIC_WIDTH para obtener la proporción. Más que eso, también deduje algo de relleno.
Abhinav Saxena
4

Esto parece un problema de XML. Abra el documento XML que contiene su Web-View. Elimina el código de relleno en la parte superior.

Luego, en el diseño, agregue

android:layout_width="fill_parent"
android:layout_height="fill_parent"

En la vista web, agregue

android:layout_width="fill_parent"
android:layout_height="fill_parent" 

Esto hace que Web-View se ajuste a la pantalla del dispositivo.

ZakiHacky
fuente
eso es lo que me ahorra tiempo.
Kabkee
2
fill_parent está desactualizado, use match_parent.
Trevor Hart
3
webview.setInitialScale(1);
webview.getSettings().setLoadWithOverviewMode(true);
webview.getSettings().setUseWideViewPort(true);
webview.getSettings().setJavaScriptEnabled(true);

funcionará, pero recuerde eliminar algo como:

<meta name="viewport" content="user-scalable=no"/>

si existía en el archivo html o cambia user-scalable = yes, de lo contrario no lo hará.

Hoang Nguyen Huu
fuente
2
int PIC_WIDTH= webView.getRight()-webView.getLeft();
Juan
fuente
1
getRight y getLeft siempre devuelven 0 para mí
yrazlik
2

Esto ayudará a ajustar el emulador de acuerdo con la página web:

WebView wb;
//CALL THIS METHOD
wb.setInitialScale(50);

Puede establecer la escala inicial en porcentaje como se muestra arriba.

jagadeesh
fuente
2

El método getWidth del objeto Display está en desuso. Anule onSizeChanged para obtener el tamaño de WebView cuando esté disponible.

WebView webView = new WebView(context) {

    @Override
    protected void onSizeChanged(int w, int h, int ow, int oh) {

        // if width is zero, this method will be called again
        if (w != 0) {

            Double scale = Double.valueOf(w) / Double.valueOf(WEB_PAGE_WIDTH);

            scale *= 100d;

            setInitialScale(scale.intValue());
        }

        super.onSizeChanged(w, h, ow, oh);
    }
};
SharkAlley
fuente
¿Cómo se obtiene WEB_PAGE_WIDTH?
prueba el
Si está intentando escalar un contenido de ancho fijo para que se ajuste a la pantalla, debe saber de antemano qué tan ancho es su contenido. ¿Tiene sentido?
SharkAlley
OK, esto debería funcionar para imágenes. Pero para las páginas web (que pueden responder), puede tener cualquier ancho> 320 px, por ejemplo.
prueba el
1

En teoría, la combinación de:

settings.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS); 

con

settings.setUseWideViewPort(false)

soluciona el problema, envolviendo el contenido y ajustándolo a la pantalla. Pero NARROW_COLUMNS ha quedado obsoleto. Le aconsejo que lea este hilo a continuación que explora el problema en detalle: https://code.google.com/p/android/issues/detail?id=62378

Alécio Carvalho
fuente
1

aquí hay una versión actualizada, que no usa métodos obsoletos, basada en la respuesta de @ danh32:

protected int getScale(Double contentWidth) {
    if(this.getActivity() != null) {
        DisplayMetrics displaymetrics = new DisplayMetrics();
        this.getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        Double val = displaymetrics.widthPixels / contentWidth * 100d;
        return val.intValue();
    } else {
        return 100;
    }
}

para ser utilizado por igual:

int initialScale = this.getScale(420d);
this.mWebView.setInitialScale(initialScale);
Martin Zeitler
fuente
0

Como referencia, esta es una implementación de Kotlin de la solución de @ danh32:

private fun getWebviewScale (contentWidth : Int) : Int {
    val dm = DisplayMetrics()
    windowManager.defaultDisplay.getRealMetrics(dm)
    val pixWidth = dm.widthPixels;
    return (pixWidth.toFloat()/contentWidth.toFloat() * 100F)
             .toInt()
}

En mi caso, tres imágenes determinaron que el ancho era de 300 pix, así que:

webview.setInitialScale(getWebviewScale(300))

Me tomó horas encontrar esta publicación. ¡Gracias!

steven smith
fuente
-4
WebView webView = (WebView)findViewById(R.id.web_view);
webView.setInitialScale((int) getResources().getDimension(R.dimen._50sdp)); // getActivity(). if you are at Fragment
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.loadDataWithBaseURL(null,here comes html content,"text/html","UTF-8", null);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setDisplayZoomControls(true);
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
Ketan Ramani
fuente
No publique dos respuestas con el mismo contenido solo por votos negativos.
techydesigner
¡Y por favor formatee su código gastando un poco de esfuerzo! ¿Por qué lo sangraste tanto a la derecha? ¿Demasiado tiempo para eliminar algunos espacios en blanco?
Massimiliano Kraus