So stellen Sie den anfänglichen Zoom / die anfängliche Breite für eine Webansicht ein

76

Ich versuche, das WebView so zu gestalten, dass es sich ähnlich wie der Android-Browser verhält. Der Browser öffnet alle Seiten so, dass versucht wird, ihre Breite an den Bildschirm anzupassen. Das Standardverhalten von WebView besteht jedoch darin, mit einer 100% igen Pixelskala zu beginnen, sodass es in der oberen linken Ecke vergrößert wird.

Ich habe die letzten Stunden damit verbracht, einen Weg zu finden, wie WebView die Seite wie im Browser auf den Bildschirm skalieren kann, aber ich habe kein Glück. Hat jemand einen Weg gefunden, dies zu erreichen?

Ich sehe eine Einstellung namens setLoadWithOverviewMode, aber das schien überhaupt nichts zu bewirken. Ich habe auch mit setInitialScale experimentiert, aber auf verschiedenen Bildschirmgrößen und Webseitengrößen, die nicht so elegant sind wie die Skalierung des Browsers.

Hat jemand irgendwelche Hinweise?

Vielen Dank

EDIT: Brians Methode scheint zu funktionieren, wenn das Telefon im Querformat, aber nicht im Hochformat. Im Hochformat ist es nah, passt aber immer noch nicht auf den gesamten Bildschirm der Seite. Ich beginne diese Prämie mit der Hoffnung, dass es einen sicheren Weg gibt, den anfänglichen Zoom so zu gestalten, dass die Seite in jeder Ausrichtung oder Bildschirmgröße an die Breite der Seite angepasst wird.

CottonBallPaws
quelle
Hast du eine Lösung dafür gefunden?
Samuel
@ Sam, yep die akzeptierte Lösung unten funktioniert für mich.
CottonBallPaws
Aus irgendeinem Grund habe ich einen ganzen Tag damit verbracht und es hat nur in api7 und nicht darüber funktioniert. Schließlich musste das gleiche mit setInitialScale implementiert und die anfängliche Skalierung manuell berechnet werden. Übrigens hatte ich ein einzelnes Bild mit 480x800 Dimensionen.
Samuel
Ich
arbeite

Antworten:

159

Der folgende Code lädt die Desktop-Version der Google-Startseite vollständig herausgezoomt, um in die webviewfür mich in Android 2.2 auf einem 854 x 480 Pixel großen Bildschirm zu passen . Wenn ich das Gerät neu ausrichte und es im Hoch- oder Querformat neu lade, passt die Seitenbreite jedes Mal vollständig in die Ansicht.

BrowserLayout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

     <WebView android:id="@+id/webview"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent" />
</LinearLayout>

Browser.java:

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class Browser extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.BrowserLayout);

        String loadUrl = "http://www.google.com/webhp?hl=en&output=html";

        // initialize the browser object
        WebView browser = (WebView) findViewById(R.id.webview);

        browser.getSettings().setLoadWithOverviewMode(true);
        browser.getSettings().setUseWideViewPort(true);

        try {
            // load the url
            browser.loadUrl(loadUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Brian
quelle
Danke Brian, das scheint auf den ersten Blick zu funktionieren. Ich werde ein paar weitere Websites testen, bevor ich das Kopfgeld belohne, aber das sieht vielversprechend aus!
CottonBallPaws
Dies war eine großartige Ex-Erklärung. +1
Tarik
es funktioniert nicht bei mir. Es scheint, dass der Zoom eingestellt ist, nachdem die Seite
geladen wurde
Das hat super funktioniert ... wie kommen die Leute auf diese Lösungen? Versuch und Irrtum, oder haben Sie einen heiligen Band?
CloudMeta
6
Diese Lösung hat auch bei mir nicht funktioniert. Ich bekomme viel schwarzen Raum rechts und unten im Inhalt. Ich lade jedoch ein Bild aus dem Assets-Ordner anstelle einer Webseite. Könnte das der Grund sein?
SilithCrowe
20

Ich fand heraus, warum die Porträtansicht das Ansichtsfenster nicht vollständig ausfüllte. Zumindest in meinem Fall lag es daran, dass die Bildlaufleiste immer angezeigt wurde. Fügen Sie zusätzlich zum obigen Ansichtsfenstercode Folgendes hinzu:

    browser.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    browser.setScrollbarFadingEnabled(false);

Dadurch nimmt die Bildlaufleiste keinen Platz im Layout ein und die Webseite kann das Ansichtsfenster füllen.

Hoffe das hilft

grimmdp
quelle
12

Es ist eine alte Frage, aber lassen Sie mich ein Detail hinzufügen, nur für den Fall, dass mehr Leute wie ich hier ankommen.

Die ausgezeichnete Antwort von Brian funktioniert bei mir in Jelly Bean nicht. Ich muss auch hinzufügen:

browser.setInitialScale(30);

Der Parameter kann ein beliebiger Prozentsatz sein, mit dem erreicht wird, dass die Größe des Inhalts kleiner als die Breite der Webansicht ist. Dann erweitert setUseWideViewPort (true) die Inhaltsbreite auf das Maximum der Webansichtsbreite.

Ivan BASART
quelle
Meine in der Webansicht angezeigte Webseite besteht aus viel Javascript, es ist eher wie OSD im Fernsehen, Widgets mit Schaltflächen. Ich habe Ihre Lösung verwendet und habe 2 Kommentare dazu: 1. Das erste Laden der Webansicht ist nicht erfolgreich, die Webansicht ist schwarz. 2. Die zweite ist korrekt, aber ich kann doppelt tippen, und das ist etwas, das ich nicht möchte, weil es skaliert Die Widgets und Schaltflächen funktionieren dann nicht mehr. Hilfe, die Sie leisten könnten? Vielen Dank.
MartinC
Es sollte beachtet werden, dass der Standardwert von WebView.setInitialScale(int)0 nicht 100 ist. Link zur Dokumentation
DBX12
Danke, es hat geholfen. Ich habe 5, 10, 30 und 70 Prozent ausprobiert. Bei 70 wurde die Größe einer großen Seite auf 70% geändert, sodass Bildlaufleisten angezeigt wurden. Bei 5-30% wurde die Größe der Seite normal geändert.
CoolMind
7

Versuchen Sie es mit einem breiten Ansichtsfenster :

 webview.getSettings().setUseWideViewPort(true);
Brian
quelle
1
Danke, das scheint in die richtige Richtung zu gehen. Das an und für sich schien nichts zu bewirken, aber mit der Kombination von setInitialScale (50) funktionierte es perfekt im Hochformat. Wenn Sie das Telefon jedoch im Querformat halten, passt es nicht zum Bildschirm. Gibt es andere Einstellungen, die ich zusätzlich zu diesen verwenden sollte? Folgendes habe ich derzeit: setBuiltInZoomControls (true), setUseWideViewPort (true), setInitialScale (50). Ich möchte, dass es gut auf den Bildschirm passt, unabhängig von der Größe oder Dichte des Bildschirms. Danke noch einmal.
CottonBallPaws
3

// Verwenden Sie für Bilder und SWF-Videos die Breite "100%" und die Höhe "98%".

mWebView2.getSettings().setJavaScriptEnabled(true);
mWebView2.getSettings().setLoadWithOverviewMode(true);
mWebView2.getSettings().setUseWideViewPort(true);
mWebView2.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
mWebView2.setScrollbarFadingEnabled(true);
Ashish Anand
quelle
können Sie mir auf diesem stackoverflow.com/questions/49098464/…
StuartDTO
1

Ich arbeite mit dem Laden von Bildern für diese Antwort und möchte, dass sie auf die Breite des Geräts skaliert werden. Ich finde, dass bei älteren Telefonen mit Versionen unter API 19 (KitKat) das Verhalten für Brians Antwort nicht ganz so ist, wie ich es mag. Es setzt viel Leerzeichen um einige Bilder auf älteren Handys, funktioniert aber auf meinem neueren. Hier ist meine Alternative mit Hilfe dieser Antwort: Kann WebView von Android die Größe großer Bilder automatisch ändern? Der Layout-Algorithmus SINGLE_COLUMNist veraltet, funktioniert aber und ist meiner Meinung nach für die Arbeit mit älteren Webansichten geeignet.

WebSettings settings = webView.getSettings();

// Image set to width of device. (Must be done differently for API < 19 (kitkat))
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    if (!settings.getLayoutAlgorithm().equals(WebSettings.LayoutAlgorithm.SINGLE_COLUMN))
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
} else {
    if (!settings.getLoadWithOverviewMode()) settings.setLoadWithOverviewMode(true);
    if (!settings.getUseWideViewPort()) settings.setUseWideViewPort(true);
}
Daniel Handojo
quelle
0

Wenn Sie die Webansicht herausgefunden haben, Ihre Bilder aber immer noch nicht maßstabsgetreu sind, war die beste Lösung, die ich ( hier ) gefunden habe, einfach, dem Dokument Folgendes voranzustellen:

<style>img{display: inline; height: auto; max-width: 100%;}</style>

Infolgedessen werden alle Bilder so skaliert, dass sie der Breite der Webansicht entsprechen.

dsalaj
quelle
0

in Kotlin können Sie verwenden,

webView.isScrollbarFadingEnabled = true
webView.setInitialScale(100)
Sazzad Hissain Khan
quelle