Aktivieren / deaktivieren Sie den Zoom in Android WebView

Es gibt einige Methoden in WebSettings im Zusammenhang mit Zoom:

  • WebSettings.setSupportZoom
  • WebSettings.setBuiltInZoomControls

Ich habe festgestellt, dass sie bei einigen Geräten anders funktionieren. Zum Beispiel, auf meinem Galaxy S Prise zu zoomen ist standardmäßig aktiviert, aber auf LG P500 ist es deaktiviert (Und jetzt weiß ich nicht, wie man NUR Prise zu zoomen, aber verstecken Zoom-Tasten zu aktivieren).

  • Verschlüsseln und Entschlüsseln mit AES EZB-Modus 'BadPaddingException' in einigen Fällen
  • Qt QML Kamera zu C ++ QImage auf Android
  • Starten Sie WhatsApp von URL HREF mit benutzerdefiniertem Text / Inhalt
  • Kompilieren und verwenden Sie ABI-abhängige ausführbare Binärdateien in Android mit Android Studio 2.2 und CMake
  • Wie benutzt man Facebook Access Token in Android App Webview
  • Wie man Test-Abhängigkeit mit Android-Gradle-Plugin experimentell 0.1.0 hinzufügen
  • Auf P500 wenn ich setBuiltInZoomControls(true) bekomme ich beide Varianten (Multitouch und Buttons).

    Wie kann ich Multitouch-Zoom aktivieren und Zoom-Tasten auf Geräten wie einem LG P500 deaktivieren? (Auch ich weiß die gleichen Probleme sind auf HTC-Geräte)

    UPDATE: Hier ist fast voller Code für die Lösung

      if (ev.getAction() == MotionEvent.ACTION_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_1_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_2_DOWN || ev.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) { if (multiTouchZoom && !buttonsZoom) { if (getPointerCount(ev) > 1) { getSettings().setBuiltInZoomControls(true); getSettings().setSupportZoom(true); } else { getSettings().setBuiltInZoomControls(false); getSettings().setSupportZoom(false); } } } if (!multiTouchZoom && buttonsZoom) { if (getPointerCount(ev) > 1) { return true; } } 

    Dieser Code ist in meiner onTouchEvent überschriebenen Methode des WebView.

  • Scannen und Bearbeiten von Android App-Speicherwerten programmgesteuert
  • Verwenden von Enums als benutzerdefinierte XML-Attribute
  • Kann ich die Google Play-In-App-Abonnement-Erneuerung vollständig serverseitig validieren?
  • Android Lollipop Toolbar vs Benutzerdefinierte Ansicht
  • Abbrechen Fertig-Schaltflächen im Kalender-App - Ist es Teil der Aktionsleiste?
  • Android-Firewall mit VpnService
  • 8 Solutions collect form web for “Aktivieren / deaktivieren Sie den Zoom in Android WebView”

    Ich habe den Quellcode für WebView und ich kam zu dem Schluss, dass es keine elegante Möglichkeit gibt, das zu erreichen, was Sie fragen.

    Was ich am Ende tat, war Unterklassen WebView und OnTouchEvent . In OnTouchEvent für ACTION_DOWN überprüfe ich, wie viele Zeiger es mit MotionEvent.getPointerCount() . Wenn es mehr als einen Zeiger gibt, rufe ich setSupportZoom(true) , sonst rufe ich setSupportZoom(false) . Ich rufe dann die super.OnTouchEvent().

    Dies wird das Zoomen beim Scrollen effektiv deaktivieren (also die Zoom-Bedienelemente deaktivieren) und das Zoomen aktivieren, wenn der Benutzer den Zoom zuschlagen möchte. Nicht eine nette Art, es zu tun, aber es hat sich gut für mich so weit gearbeitet.

    Beachten Sie, dass getPointerCount() in 2.1 eingeführt wurde, so dass Sie einige zusätzliche Sachen machen müssen, wenn Sie 1.6 unterstützen.

    Auf API> = 11 können Sie:

     wv.getSettings().setBuiltInZoomControls(true); wv.getSettings().setDisplayZoomControls(false); 

    Nach dem SDK:

     public void setDisplayZoomControls (boolean enabled) 

    Seit: API Stufe 11

    Legt fest, ob die Zoom-Zoom-Tasten verwendet werden. Eine Kombination von eingebauten Zoom-Steuerelementen aktiviert und auf Bildschirm Zoom-Steuerelemente deaktiviert ermöglicht Klemme zu zoomen, um zu arbeiten, ohne die Bedienelemente auf dem Bildschirm

    Wir hatten das gleiche Problem bei der Arbeit an einer Android-Anwendung für einen Kunden und ich habe es geschafft, "Hack" um diese Einschränkung.

    Ich habe mir einen Blick auf den Android-Quellcode für die WebView-Klasse geworfen und eine updateZoomButtonsEnabled() -Methode entdeckt, die mit einem ZoomButtonsController , um die Zoom-Steuerelemente abhängig von der aktuellen Skalierung des Browsers zu aktivieren und zu deaktivieren.

    Ich suchte nach einer Methode, um die ZoomButtonsController Instanz zurückzugeben und fand die getZoomButtonsController() -Methode , die diese Instanz zurückgegeben hat.

    Obwohl die Methode public erklärt wird, ist sie nicht in der WebView dokumentiert und Eclipse konnte es auch nicht finden. Also habe ich versucht, etwas zu reflektieren und schuf meine eigene WebView Unterklasse, um die onTouchEvent() -Methode zu überschreiben, die die Steuerelemente ausgelöst hat.

     public class NoZoomControllWebView extends WebView { private ZoomButtonsController zoom_controll = null; public NoZoomControllWebView(Context context) { super(context); disableControls(); } public NoZoomControllWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); disableControls(); } public NoZoomControllWebView(Context context, AttributeSet attrs) { super(context, attrs); disableControls(); } /** * Disable the controls */ private void disableControls(){ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { // Use the API 11+ calls to disable the controls this.getSettings().setBuiltInZoomControls(true); this.getSettings().setDisplayZoomControls(false); } else { // Use the reflection magic to make it work on earlier APIs getControlls(); } } /** * This is where the magic happens :D */ private void getControlls() { try { Class webview = Class.forName("android.webkit.WebView"); Method method = webview.getMethod("getZoomButtonsController"); zoom_controll = (ZoomButtonsController) method.invoke(this, null); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onTouchEvent(MotionEvent ev) { super.onTouchEvent(ev); if (zoom_controll != null){ // Hide the controlls AFTER they where made visible by the default implementation. zoom_controll.setVisible(false); } return true; } } 

    Vielleicht möchten Sie die unnötigen Konstruktoren entfernen und auf wahrscheinlich auf die Ausnahmen reagieren.

    Obwohl dies hacky und unzuverlässig aussieht, funktioniert es wieder auf API Level 4 (Android 1.6).


    Wie @jayellos in den Kommentaren darauf hingewiesen hat, ist die private getZoomButtonsController() auf Android 4.0.4 und höher nicht mehr vorhanden.

    Allerdings muss es nicht. Mit der bedingten Ausführung können wir überprüfen, ob wir auf einem Gerät mit API Level 11+ sind und die exponierte Funktionalität verwenden (siehe @Yuttadhammo Antwort), um die Steuerelemente auszublenden.

    Ich habe den Beispielcode oben aktualisiert, um genau das zu tun.

    Ive modifiet Lukas Knuths Lösung ein wenig:

    1) Es gibt keine Notwendigkeit, Unterklassen der Webview,

    2) der Code wird während der Bytecode-Überprüfung auf einigen Android 1.6-Geräten abstürzen, wenn Sie keine nicht vorhandenen Methoden in getrennten Klassen setzen

    3) Zoom-Steuerelemente werden immer noch angezeigt, wenn der Benutzer eine Seite nach oben / unten blättert. Ich setze einfach den Zoom-Controller-Container auf Sicht GONE

      wv.getSettings().setSupportZoom(true); wv.getSettings().setBuiltInZoomControls(true); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { // Use the API 11+ calls to disable the controls // Use a seperate class to obtain 1.6 compatibility new Runnable() { public void run() { wv.getSettings().setDisplayZoomControls(false); } }.run(); } else { final ZoomButtonsController zoom_controll = (ZoomButtonsController) wv.getClass().getMethod("getZoomButtonsController").invoke(wv, null); zoom_controll.getContainer().setVisibility(View.GONE); } 

    Lukas Knuth haben gute Lösung, aber auf Android 4.0.4 auf Samsung Galaxy SII Ich sehe immer noch Zoom-Steuerelemente. Und ich lasse es über

     if (zoom_controll!=null && zoom_controll.getZoomControls()!=null) { // Hide the controlls AFTER they where made visible by the default implementation. zoom_controll.getZoomControls().setVisibility(View.GONE); } 

    Anstatt von

     if (zoom_controll != null){ // Hide the controlls AFTER they where made visible by the default implementation. zoom_controll.setVisible(false); } 

    Die Lösung, die du gepostet hast, scheint beim Stoppen der Zoom-Bedienelemente zu erscheinen, wenn der Benutzer zieht, aber es gibt Situationen, in denen ein Benutzer den Zoom zuschlagen wird und die Zoom-Steuerelemente angezeigt werden. Ich habe bemerkt, dass es 2 Möglichkeiten gibt, dass das Webview Pinch-Zooming akzeptiert, und nur einer von ihnen bewirkt, dass die Zoom-Steuerelemente trotz deines Codes erscheinen:

    User Pinch Zooms und Kontrollen erscheinen:

     ACTION_DOWN getSettings().setBuiltInZoomControls(false); getSettings().setSupportZoom(false); ACTION_POINTER_2_DOWN getSettings().setBuiltInZoomControls(true); getSettings().setSupportZoom(true); ACTION_MOVE (Repeat several times, as the user moves their fingers) ACTION_POINTER_2_UP ACTION_UP 

    User Pinch Zoom und Controls erscheinen nicht:

     ACTION_DOWN getSettings().setBuiltInZoomControls(false); getSettings().setSupportZoom(false); ACTION_POINTER_2_DOWN getSettings().setBuiltInZoomControls(true); getSettings().setSupportZoom(true); ACTION_MOVE (Repeat several times, as the user moves their fingers) ACTION_POINTER_1_UP ACTION_POINTER_UP ACTION_UP 

    Kannst du deine lösung mehr bezahlen?

    Verbesserte Version von Lukas Knuth:

     public class TweakedWebView extends WebView { private ZoomButtonsController zoomButtons; public TweakedWebView(Context context) { super(context); init(); } public TweakedWebView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public TweakedWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { getSettings().setBuiltInZoomControls(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getSettings().setDisplayZoomControls(false); } else { try { Method method = getClass() .getMethod("getZoomButtonsController"); zoomButtons = (ZoomButtonsController) method.invoke(this); } catch (Exception e) { // pass } } } @Override public boolean onTouchEvent(MotionEvent ev) { boolean result = super.onTouchEvent(ev); if (zoomButtons != null) { zoomButtons.setVisible(false); zoomButtons.getZoomControls().setVisibility(View.GONE); } return result; } } 

    Hey da für alle, die vielleicht nach einer Lösung wie diese suchen .. Ich hatte Problem mit Skalierung in WebView so beste Art und Weise zu tun ist in Ihrem java.class, wo Sie alle für WebView setzen diese zwei Zeile Code: (WebViewSearch ist Name von Mein webView -> webViewSearch = (WebView) findViewById (R.id.id_webview_search);)

     // force WebView to show content not zoomed--------------------------------------------------------- webViewSearch.getSettings().setLoadWithOverviewMode(true); webViewSearch.getSettings().setUseWideViewPort(true); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.