Visualizzazione web Android: la pagina web dovrebbe adattarsi allo schermo del dispositivo


103

Ho provato quanto segue per adattare la pagina Web in base alle dimensioni dello schermo del dispositivo.

mWebview.setInitialScale(30);

e quindi impostare la visualizzazione dei metadati

<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"/>

Ma non funziona nulla, la pagina web non è fissata alle dimensioni dello schermo del dispositivo.

Qualcuno può dirmi come ottenerlo?

Risposte:


82

Devi calcolare la scala che devi usare manualmente, invece di impostare a 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();
}

Quindi usa

WebView web = new WebView(this);
web.setPadding(0, 0, 0, 0);
web.setInitialScale(getScale());

7
Grazie per la tua risposta, hai ragione, funziona. ma ho un problema diverso. Non sto caricando un'immagine, caricando la pagina Web nella visualizzazione Web, quindi come scoprire la larghezza della pagina Web (PIC_WIDTH).
SWDeveloper

1
Ah, mi mancava quella costante lì dentro. Mi dispiace per quello. Non sono sicuro di come ottenere la larghezza della pagina web effettiva.
danh32

54
Cos'è PIC_WIDTH qui?
Paresh Mayani

4
PIC_WIDTH era una costante che conoscevo in anticipo, poiché stavo visualizzando solo una singola immagine dalla cartella delle risorse. Come ho detto sopra, non so come ottenere la larghezza della pagina web effettiva.
danh32

1
@MaheshwarLigade io uso PIC_WIDTH = 360
Nicholas Ng

292

Puoi usarlo

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

questo risolve le dimensioni in base alle dimensioni dello schermo.


4
Questo piedi lo schermo ma non ti permette più di fare lo zoom avanti / indietro. Questo problema potrebbe essere migliorato? So che è possibile su IOS.
AlexAndro

1
questa impostazione funziona per me ma solo per la larghezza, negli stessi casi ora
taglia

1
Questa è la migliore soluzione per ottenere ciò che ho trovato finora.
venerdì

1
Il fatto che la soluzione sia integrata mi conquista davvero.
Daniel Handojo,

3
Per aggiungere lo zoom, aggiungi quanto segue: webview.getSettings (). SetBuiltInZoomControls (true); webview.getSettings () setDisplayZoomControls (false).;
Andrew

34

Amici,

Ho trovato da te molte informazioni importanti e ottime. Ma l'unico modo per me funziona era in questo modo:

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

Sto lavorando su Android 2.1 a causa del tipo di dispositivi dell'azienda. Ma ho risolto il mio problema utilizzando la parte delle informazioni di ciascuno.

Grazie!


Quindi lo zoom non funziona più. Sono l'unico con questo problema?
test il

@test hai trovato qualche soluzione?
Anshul Tyagi

@AnshulTyagi: No, non l'ho fatto. Poiché era un progetto di prova per me, non ho indagato ulteriormente su questo. Fammi sapere se trovi qualcosa!
test il

@AnshulTyagi: Per le pagine web questo approccio funziona per me. Per le immagini devo usare qualcosa di diverso ...
test il

31

Queste impostazioni hanno funzionato per me:

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

setInitialScale (1) mancava nei miei tentativi.

Sebbene la documentazione dica che 0 si ingrandirà completamente se setUseWideViewPort è impostato su true ma 0 non ha funzionato per me e ho dovuto impostare 1 .


1
Non stavo impostando la scala iniziale e per me ha funzionato per anni. (Stavo solo impostando la modalità panoramica e il viewport). Ma un nuovo dispositivo che ho appena incontrato sembrava iniziare a ingrandire fino a quando la pagina non si è aggiornata. L'impostazione della scala iniziale ha risolto questo problema per me.
Doomsknight


15

Tutto quello che devi fare è semplicemente

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

13

Questi funzionano per me e adattano il WebView alla larghezza dello schermo:

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

Grazie ai consigli di cui sopra e alla riga bianca nella visualizzazione Web di eclissi


3
Sembra che SINGLE_COLUMN sia ora deprecato developer.android.com/reference/android/webkit/…
Alexander Abramov

11

Ho lo stesso problema quando uso questo codice

webview.setWebViewClient(new WebViewClient() {
}

quindi potrebbe essere necessario rimuoverlo nel codice
e ricordarsi di aggiungere 3 modalità di seguito per la visualizzazione web

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

questo risolve le dimensioni in base alle dimensioni dello schermo


2
@shahzainali puoi ingrandire la tua visualizzazione web?
Anshul Tyagi

@AnshulTyagi No, non ingrandisce.
shahzain ali

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

Questo funziona alla grande per me poiché la dimensione del testo è stata impostata su molto piccola da .setLoadWithOverViewMode e .setUseWideViewPort.


6

Avevo il video in stringa html e la larghezza della visualizzazione web era maggiore della larghezza dello schermo e questo funziona per me.

Aggiungi queste righe alla stringa HTML.

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

Risultato dopo aver aggiunto il codice sopra alla stringa HTML:

<!DOCTYPE html>
<html>

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


</html>

5

In questo caso devi usare HTML nella tua webView. Ho risolto questo problema usando il seguente codice

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

immagino sia meglio usare px ot vh invece di%. % negli iframe presenta alcuni bug sui cambiamenti di orientamento
Siarhei

4

Apportare modifiche alla risposta di danh32 a partire da display.getWidth (); è ora deprecato.

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

Quindi usa

WebView web = new WebView(this);
web.setPadding(0, 0, 0, 0);
web.setInitialScale(getScale());

Ho calcolato che la scala dovrebbe essere <1 o 100%, quindi ho confrontato la mia larghezza con PIC_WIDTH per ottenere il rapporto. Oltre a questo ho anche detratto un po 'di imbottitura.
Abhinav Saxena

4

Sembra un problema XML. Apri il documento XML contenente la tua visualizzazione Web. Elimina il codice di riempimento in alto.

Quindi nel layout, aggiungi

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

Nella visualizzazione Web, aggiungi

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

In questo modo la visualizzazione Web si adatta allo schermo del dispositivo.


questo è ciò che mi fa risparmiare tempo.
Kabkee

2
fill_parent è obsoleto, utilizza match_parent.
Trevor Hart

3
webview.setInitialScale(1);
webview.getSettings().setLoadWithOverviewMode(true);
webview.getSettings().setUseWideViewPort(true);
webview.getSettings().setJavaScriptEnabled(true);

funzionerà, ma ricorda di rimuovere qualcosa come:

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

se esisteva nel file html o cambia user-scalable = yes, altrimenti non lo farà.


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

1
getRight e getLeft restituiscono sempre 0 per me
yrazlik

2

Questo aiuterà a regolare l'emulatore in base alla pagina web:

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

È possibile impostare la scala iniziale in percentuale come mostrato sopra.


2

Il metodo getWidth dell'oggetto Display è deprecato. Eseguire l'override di onSizeChanged per ottenere la dimensione del WebView quando diventa disponibile.

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

Come si ottiene WEB_PAGE_WIDTH?
test il

Se stai cercando di ridimensionare alcuni contenuti a larghezza fissa per adattarli allo schermo, dovresti sapere in anticipo quanto è ampio il tuo contenuto. Ha senso?
SharkAlley

OK, dovrebbe funzionare per le immagini. Ma per le pagine web (che possono essere reattive) può essere qualsiasi larghezza> 320 px, ad esempio.
test il


1

ecco una versione aggiornata, che non utilizza metodi deprecati, basata sulla risposta di @ 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;
    }
}

da utilizzare allo stesso modo:

int initialScale = this.getScale(420d);
this.mWebView.setInitialScale(initialScale);

0

Per riferimento, questa è un'implementazione Kotlin della soluzione di @ 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()
}

Nel mio caso, la larghezza è stata determinata da tre immagini per essere 300 pixel, quindi:

webview.setInitialScale(getWebviewScale(300))

Mi ci sono volute ore per trovare questo post. Grazie!


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

Si prega di non pubblicare due risposte con lo stesso contenuto solo a causa dei voti negativi.
techydesigner

E per favore formatta il tuo codice spendendo un po 'di impegno! Perché l'hai fatto rientrare a destra così tanto? Troppo tempo per eliminare alcuni spazi bianchi?
Massimiliano Kraus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.