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?

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());

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.


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!


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 .


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


15

Todo lo que necesitas hacer es simplemente

webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);

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


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


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.


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>

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);

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());

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.


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á.


2
int PIC_WIDTH= webView.getRight()-webView.getLeft();

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.


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);
    }
};

¿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

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);

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!


-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);

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.