Disattivare lo zoom quando si fa clic sui campi del modulo all’interno di una WebView?

Ho guardato attraverso decine e decine di pagine, se domande simili, nessuno di loro ha tutte le risposte, quindi speriamo che questo sarà diverso.

Ho una webview, e non voglio fare lo zoom della visualizzazione per cambiare da un iniziale livello di zoom l’ho impostato per. L’unica cosa che cambia il livello di zoom attualmente è quando una casella di testo è incentrato.

Ho bisogno di essere in grado di fare questo attraverso il codice Java, non utilizzando il meta tag viewport.

Così non ho le risposte comuni, ho il seguente nel mio codice per disattivare lo zoom, e i controlli di zoom:

mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setSupportZoom(false);

Penso che una possibile soluzione è controllare per vedere quando un onFocus o anche un evento onClick si verifica all’interno della WebView e poi zoommare, ma io non sono nemmeno sicuro se questo è possibile?

Ogni suggerimento sarà apprezzato.

  • Si prega di notare, questo sembra avvenire solo su dispositivi HTC (Incredible, EVO). L’applicazione funziona bene all’interno dell’emulatore e su 3 dispositivi Android di Motorola (Droid X, Droid Pro, Originale Droid, Droid 2).
  • Sto affrontando lo stesso problema. Ho provato con diverse combinazioni di WebSettings, ma nessuno di loro sembra funzionare nel modo desiderato. Dal modo in cui @evolvere, questo accadrebbe anche su un Samsung Galaxy Tab, quindi, non solo HTC.
  • se si aggiunge un tag viewport si dovrebbe essere in grado di ottenere l’applicazione che funziona su Galaxy, ho solo problemi su dispositivi HTC attualmente.
  • grazie per la risposta, ma il mio web le impostazioni relative a zoom sono le seguenti: setLoadWithOverviewMode = true; setUseWideViewPort = true; setLayoutAlgorithm = LayoutAlgorithm.NORMALE; setSupportZoom = false. E ancora, lo zoom quando cliccando su un testo di input.
  • hai provato webview.setInitialScale(100)?
  • Bene, ho provato anche quello, @evolvere, ma mi chiedevo… con tag viewport si intende HTML meta tag? Se è così cercherò, causa sto abilitando la visualizzazione all’interno del codice di android.
  • In realtà, ho parlato troppo presto, il problema è causato da Sense UI (HTC), e che è disponibile sul Galaxy ora, io non ce l’ho sulla mia, però. Se si disattiva ho un problema andrà via.
  • mi dispiace non farlo. Il Galaxy Tab (e S) sono al lavoro con il TouchWiz UI, che Cosa vuoi dire con “è disponibile sul Galaxy ora”? Il problema è “disponibile”? Cosa posso disabilitare? Comunque, non voglio disturbare, ma io sarò a lavorare su questa materia sia per HTC e Samsung, se sono riuscito a scoprire qualcosa posterò un’effettiva risposta =).
  • fa il livello di zoom cambia trigger onScaleChanged() nel WebViewClient?
  • La disattivazione dello Zoom anche risolto i problemi che ho avuto con uso di Responsive Design in una WebView in pre-4.0 dispositivi.

InformationsquelleAutor tplaner | 2011-01-28

 

9 Replies
  1. 22

    AGGIORNAMENTO Questa risposta è stata scritta quasi 6 anni fa, con tutte le nuove versioni di android che è venuto da allora, questo è più probabile che non aggiornati.

    Questa cosa ha causato un grande mal di testa, ma finalmente è stato risolto grazie a setDefaultZoom(ZoomDensity.FAR);

    Una cosa che è importante è che onCreate e loadUrl chiamato prima il WebSettings, altrimenti causato un force close situazione. Qui il INTERO codice, ivi comprese le importazioni (per il novizio gli utenti di Java)

    package com.my.app;
    
    import android.os.Bundle;
    import android.webkit.WebSettings;
    import android.webkit.WebSettings.ZoomDensity;
    
    import com.phonegap.*;
    
    public class MyDroidActivity extends DroidGap {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.loadUrl("file:///android_asset/www/index.html");
            WebSettings settings = appView.getSettings();
            settings.setBuiltInZoomControls(false);
            settings.setSupportZoom(false);
            settings.setDefaultZoom(ZoomDensity.FAR);
        }
    }
    • Questo funziona come è, tuttavia, se si hanno difficoltà a ottenere l’applicazione a scala inizialmente e usare questo fix: uihacker.blogspot.com/2011/01/… quindi questo fix cessa di funzionare più 🙁 sto tirando i capelli fuori su questo.
    • Avete mai trovare una soluzione per questo?
    • Il fatto che questo non è accettato risposta è un crimine. Se ho potuto votarlo 100 volte vorrei. Si appena conclusa la 4 ore di sessione di risoluzione dei problemi per me. Grazie.
    • Questo non funziona per alcuni dispositivi con KitKat.
    • Confermato che non funziona per i dispositivi KitKat. Avete qualche altra soluzione? Grazie.
    • Non funziona su Nexus 5 emulatore API 21

  2. 5

    Ho risolto questo sui telefoni HTC con l’aggiunta di un WebViewClient con un vuoto ascoltatore per onScaleChanged. La mia app PhoneGap, quindi questo è quello che sembra, ma aggiungendo l’ascoltatore dovrebbe essere lo stesso in un non-PhoneGap app:

    public class Main extends DroidGap {
    
    private class NoScaleWebViewClient extends GapViewClient {
    
        public NoScaleWebViewClient(DroidGap ctx) {
            super(ctx);
        }
    
        public void onScaleChanged(WebView view, float oldScale, float newScale) {
            Log.d("NoScaleWebViewClient", "Scale changed: " + String.valueOf(oldScale) + " => " + String.valueOf(newScale));
        }
    }
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        this.init();
        setWebViewClient(appView, new NoScaleWebViewClient(this));
        //disables the actual onscreen controls from showing up
        appView.getSettings().setBuiltInZoomControls(false);
        //disables the ability to zoom
        appView.getSettings().setSupportZoom(false);
        appView.getSettings().setDefaultZoom(ZoomDensity.FAR);
        appView.setInitialScale(100);
    }

    }

    Stranamente, il onScaleChange ascoltatore non viene chiamato — ascoltando lo zoom, si blocca lo zoom da accadendo. Ho scoperto che ho bisogno di tutte le altre chiamate (setSupportZoom, setDefaultZoom, setInitialScale) in ordine per questo lavoro, e la rimozione di uno di loro verrà ripristinato il vecchio, il comportamento anomalo.

    • Se faccio tutte queste impostazioni SENZA sovrascrivere WebViewClient, a me funziona
  3. 5

    Ho avuto lo stesso problema. Ho bisogno di trovare un modo per ridimensionare il contenuto di webview per valore esatto, tutto ha funzionato bene fino a quando un utente inizia a inserire il testo. Ci sono metodi che funzionano relativamente nuovi dispositivi android 4.0+, ma non su quelli vecchi. L’unico modo che funziona ovunque è l’impostazione del valore di zoom, non in Java, ma in viewport come questo

    <meta name="viewport" content="initial-scale=.80; maximum-scale=.80; minimum-scale=.80;" />

    Funziona su tutti i dispositivi che ho provato.

  4. 2

    Hai provato a disabilitare l’utente scalabile nel tag viewport? Non sono sicuro se questo funziona per voi, ma per me funziona. Non ho bisogno di fare nulla java lato.

    <meta name="viewport" content="user-scalable=no, width=device-width" />
    • Penso che @evolvere provato che, in base ai commenti sulla sua domanda, ma voglio provare a me stesso.
    • Il problema si verifica ancora su dispositivi HTC (qualsiasi dispositivo che utilizza la Sense UI interfaccia utente).
  5. 2

    Ho riscontrato questo problema, e ho risolto così:

    myWebview.getSettings().setDefaultZoom(ZoomDensity.FAR);

    È in esecuzione normalmente Sumsung Galaxy Tab. Spero che questo vi aiuterà.

  6. 1

    WebView che ha una speciale “cosa”, che credo si attiverà una serie di domande e risposte qui. Quello che succede è che quando un URL viene caricato, il Browser di default di Android calci attraverso un Intenzione di gestire questo. Il zoom prende parte a questo browser, non nel tuo Webview.

    Soluzione: È necessario aggiungere un WebviewClient a dire Android che consente di gestire l’esplorazione di se stessi. Un esempio:

    //Use WebView and disable zooming
    
    public class MyWebView extends Activity {
        //nested class
        private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true
            }
        }
    
        private WebView mWebView;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            mWebView = (WebView) findViewById(R.id.webview);
            mWebView.setWebViewClient(new HelloWebViewClient());
            mWebView.setInitialScale(500);   //added after user comment
    
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.getSettings().setBuiltInZoomControls(false);
            mWebView.getSettings().setSupportZoom(false);
    
            mWebView.loadUrl("http://www.google.com");      
    
        }
    }

    Mio main.xml simile a questo

    <?xml version="1.0" encoding="utf-8"?>
    <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    />

    Questo codice disabili zoom sul mio HTC Desire con Android 2.2. Toccando in HTML campi di Input non fa alcuna differenza.

    L’intero argomento di WebView/HelloWebViewClient così come un suggerimento importante per gestire il pulsante “Indietro” correttamente documentato nel Ciao A Vista, Visualizzazione Web. Dovrebbe essere una lettura obbligatoria per chiunque utilizzi il WebView.

    • Ho cercato per questo pulsante indietro problema. Grazie mille 🙂
    • Mi dispiace, non voglio essere scortese, ma hai veramente capito la domanda? Voglio dire, che cosa la domanda è, non è solo “disabilitare lo zoom”. Si tratta di evitare certi comportamenti, che rende alcuni dispositivi (principalmente HTC) per auto-zoom al 100% quando un utente preme su un campo di input html. Nell’esempio che hai dato, questo non sta accadendo causa lo zoom è già al 100% all’inizio.
    • Sto cercando di implementare questa ora, ti farò sapere se risolve il mio problema. Grazie.
    • Su guardando il mio codice, ho capito che in realtà sto già facendo questo, e funziona su qualsiasi dispositivo HTC. Il motivo per cui non funziona su dispositivi HTC sembra essere un problema noto con la Sense UI interfaccia utente che a quanto pare viene eseguito su-parte superiore della base con il codice di android.
    • mdelolmo: Hai ragione. Non posso riprodurre il problema e, pertanto, ha risposto alla domanda non è nel vostro interesse. Quando ho impostato una scala iniziale in questo scenario rimane la stessa indipendentemente dal toccando in html campi di input o non. Forse si potrebbe fornire un codice di riprodurre il problema, in particolare il punto del codice in cui si imposta il livello di zoom e e un URL con un campo di input che innesca la behvaviuor che tu descrivi. Come ho scritto sopra sto lavorando con un HTC.
    • aggiungere <meta name="viewport" content="user-scalable=no, width=device-width" /> per il codice HTML della pagina si sta caricando e si potrà vedere il problema.
    • Quindi il problema si verifica solo quando questo HTML5 metatag è impostato? Ti andrebbe di mettere queste importanti informazioni in questione? Ho letto il tuo problema ora come “pagine HTML che utilizzano il metatag viewport per impostare loro di scala (impostando la finestra per l’esattezza) per Un SDK e il ridimensionamento parametri che stabiliscono la loro scala B – contraddicendo i parametri sembrano avere problemi”. Credo che I thats sorta di inevitabile, il tempo non è definito il meccanismo dovrebbe annullare l’altro. quirksmode.org/mobile/viewports.html potrebbe aiutare.

  7. 0

    Credo che si può impostare il livello di zoom con WebView.setInitialScale metodo. Ci vuole un int come scala quindi credo che si vorrebbe fare qualcosa di simile myWebView.setInitialScale(100).

  8. 0

    Questo problema è stato risolto da un aggiornamento del firmware su dispositivi HTC, è stato (a quanto pare) sia causato dall’Sense UI di ignorare l’impostazione predefinita di Android funzionalità in modo non corretto.

    È molto difficile fornire informazioni su esattamente quando questo è stato corretto, comunque la mia applicazione web non è più zoom quando una casella di testo viene fatto clic su qualsiasi dispositivo HTC con il firmware più recente.

    Le seguenti due righe di codice consente di disattivare il “zoom” aspetti di una webview di android:

    //disables the actual onscreen controls from showing up
    mWebView.getSettings().setBuiltInZoomControls(false);
    //disables the ability to zoom
    mWebView.getSettings().setSupportZoom(false);

Lascia un commento