2010-09-13 15 views
11

Lorsqu'un utilisateur clique dans un champ de saisie ou une zone de texte, l'application effectue un zoom avant. Y a-t-il un moyen simple de le désactiver?Existe-t-il un moyen de désactiver la fonction de zoom sur les champs de saisie dans Webview?

ont actuellement la balise meta:

meta name="viewport" content="width=device-width; height=device-height; initial-scale=1.0; maximum-scale=1.0; user-scalable=no; target-densityDpi=device-dpi;" 

Tout est superbe jusqu'à ce que je regarde sur un appareil avec Android 2.2 Plus précisément HTC Evo 4G.

+0

Voulez-vous désactiver complètement le zoom dans 'WebView'? –

+0

Je sais que ça fait longtemps, mais avez-vous finalement réussi à résoudre ce problème? Est-ce que la réponse de TheisEgeberg fonctionne? – mdelolmo

+0

C'est fou que cela ne fonctionne pas. Honnêtement, si l'implémentation de la méta-balise viewport était correcte sur la base de la documentation, nous devrions juste pouvoir déclarer une largeur et être fait avec ce ish. Mais à la place cela ne marche pas du tout, nous devons recourir à la bande-aiding les problèmes de mise à l'échelle sur ces dispositifs qui cassent alors notre capacité d'empêcher le zoom de clavier! – SublymeRick

Répondre

3

Je me suis amusé avec cet alot.

Vous devez avoir différentes solutions pour différentes tailles d'écran et de téléphones, sur le côté serveur.

Cela fonctionne pour HTC Desire par exemple:

<meta content='True' name='HandheldFriendly' /> 
<meta content='width=640px; initial-scale=0.50; maximum-scale=0.50;minimum-scale=0.50;' name='viewport' /> 
<meta name="viewport" content="width=640px" /> 

Ceci est pour un iphone:

<meta name="viewport" content="width=640px,user-scalable=0" /> 
+1

dans l'exemple de code htc , pourquoi définissez-vous la largeur à 640px dans la deuxième ligne, puis définissez-le à la même valeur dans le troisième? –

0

J'ai le même problème (sur un HTC Incredible) et n'ont pas encore trouvé de solution satisfaisante. Mais, une chose que j'ai remarquée est que si vous utilisez le site mobile de Google (http://google.com/m) vous n'obtenez pas ce comportement, j'essaie de comprendre pourquoi c'est le cas.

J'ai essayé tous les correctifs mentionnés sur stackoverflow que j'ai pu trouver, y compris sur ce thread et rien de ce que j'ai trouvé fonctionne jusqu'à maintenant. Un correctif de merde J'ai trouvé les travaux est de définir l'échelle initiale à 150 (1.5X), puis d'élargir votre site Web en conséquence, vous n'obtenez pas ce comportement de zoom - peut-être parce qu'il veut un niveau de zoom de 1.5X quand vous cliquez sur une entrée de texte et si vous êtes déjà à ce niveau de zoom alors rien ne se passe? Mais, cela se sent super hacky et n'est probablement pas robuste sur tous les téléphones.

0

Voici comment je résolu que:

Sur toutes mes pages je:

<link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:0.75)" href="css/ldpi.css" /> 
<link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1)" href="css/mdpi.css" /> 
<link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="css/hdpi.css" /> 
<meta name="viewport" content="target-densitydpi=device-dpi" /> 

Sur les pages avec des champs d'entrée, j'ai:

<link rel="stylesheet" media="screen" href="css/mdpi.css" /> 
<meta name="viewport" content="target-densitydpi=medium-dpi" /> 

Alors, je ne t bénéficier de hdpi sur les formulaires, mais au moins il ne zoome pas

1

J'ai trouvé la réponse, au moins pour moi. Il fonctionne sur HTC désir et Sansung 3 basse résolution.

  • Supprime les balises META de la fenêtre d'affichage à partir du code HTML.

  • En Java appliquer la solution que l'on peut trouver here.

    this.appView.getSettings().setSupportZoom(true); //Modify this 
    this.appView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);//Add this 
    

    Souvenez-vous de tester si WebSettings.ZoomDensity.FAR est disponible à votre version du SDK (7 et plus).

0

il y a un champ int webview.class mDefaultScale flotteur le code source montre que lorsque vous affichez SoftKeyboard le mActualScale changera. donc mDefaultScale est le problème. vous pouvez l'apprendre à partir du site grepcode.

private void displaySoftKeyboard(boolean isTextView) { 
    InputMethodManager imm = (InputMethodManager) 
    getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
     if (isTextView) { 
      if (mWebTextView == null) return; 
      imm.showSoftInput(mWebTextView, 0); 

      if (mActualScale < mDefaultScale) { 

       // bring it back to the default scale so that user can enter 

       // text. 
       mInZoomOverview = false; 
       mZoomCenterX = mLastTouchX; 
       mZoomCenterY = mLastTouchY; 
       // do not change text wrap scale so that there is no reflow 
       setNewZoomScale(mDefaultScale, false, false); 
       adjustTextView(false); 
      } 
     } 

     else { // used by plugins 
      imm.showSoftInput(this, 0); 
     } 

    } 
+0

Pourriez-vous élaborer à ce sujet? Est-ce à partir du code source de l'OS? Y a-t-il quelque chose que nous pourrions faire ici pour régler notre problème ou est-ce juste une sorte de: «C'est le problème et pourquoi, mais vous ne pouvez rien faire à ce sujet» genre de chose? – SublymeRick

1

N'est-ce pas simplement un problème d'ajustement de la taille du texte?

body{ 
    -webkit-text-size-adjust:none; 
} 
+0

Cela ne fonctionne pas pour moi: S – Rahnzo

0

Je sais que ce fil est de l'histoire ancienne, mais j'ai eu la question de la mise à l'échelle avec le clavier virtuel et a finalement trouvé la solution à ce lien:

http://rickluna.com/wp/2012/02/set-app-scaling-in-phonegap-android/

Ajouter ces lignes à la source java de l'application J'ai changé MEDIUM en FAR ce qui maintient l'écran à l'agrandissement d'origine 1,0.

Espérons que d'autres personnes qui sauve quelques recherches

2
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); 

Cette méthode a été dépréciée dans le niveau de l'API 19.

cela fonctionne dans les dernières versions d'Android 4.4.2.

webView.setInitialScale(0);//default,no zoom 
webView.getSettings().setSupportZoom(true); 
webView.getSettings().setBuiltInZoomControls(true); 
webView.getSettings().setLoadWithOverviewMode(false); 
webView.getSettings().setUseWideViewPort(false); 
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
1

qui se trouve juste dans le manifeste:

android:windowSoftInputMode="adjustPan" 
+0

cela fonctionne pour désactiver le zoom, mais le webview ne fait pas défiler vers le haut pour afficher le champ –

0

Enfin, je trouve une solution pour mon projet dans le monde réel.

- MainActivity.java 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    WebView mWebView = (WebView) findViewById(R.id.webview); 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
     mWebView.setOnFocusChangeListener(new MyOnFocusChangeListener(getScale())); 
    } 
    Log.i(MainActivity.class.getSimpleName(), "getScale: " + getScale()); 
} 

/** 
* Calculate the scale that we need to use manually. 
* 
* @return the scale that we need 
*/ 
private float getScale() { 
    DisplayMetrics display = this.getResources().getDisplayMetrics(); 
    int width = display.widthPixels; 
    Float val = Float.valueOf(width)/Float.valueOf(Constants.PAGE_WIDTH); 
    return val.floatValue(); 
} 

- MyOnFocusChangeListener.java 

public class MyOnFocusChangeListener implements View.OnFocusChangeListener { 

    protected float mScale; 

    public MyOnFocusChangeListener(float scale) { 
     mScale = scale; 
    } 

    /** 
    * Implement this method because we want to apply scale when focus changed. 
    * @param v the View we want to apply scale when focus changed. 
    * @param hasFocus has a focus or not. 
    */ 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus) { 
      // We must try all cases because mDefaultScale will change on different versions of Android. 
      try { 
       Field defaultScale = WebView.class.getDeclaredField("mDefaultScale"); 
       defaultScale.setAccessible(true); 
       defaultScale.setFloat(v, mScale); 
      } catch (SecurityException e) { 
       e.printStackTrace(); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (NoSuchFieldException e) { 
       try { 
        Field zoomManager; 
        zoomManager = WebView.class.getDeclaredField("mZoomManager"); 
        zoomManager.setAccessible(true); 
        Object zoomValue = zoomManager.get(v); 
        Field defaultScale = zoomManager.getType().getDeclaredField("mDefaultScale"); 
        defaultScale.setAccessible(true); 
        defaultScale.setFloat(zoomValue, mScale); 
       } catch (SecurityException e1) { 
        e1.printStackTrace(); 
       } catch (IllegalArgumentException e1) { 
        e.printStackTrace(); 
       } catch (IllegalAccessException e1) { 
        e.printStackTrace(); 
       } catch (NoSuchFieldException e1) { 
        try { 
         Field mProviderField = WebView.class.getDeclaredField("mProvider"); 
         mProviderField.setAccessible(true); 
         Object webviewclassic = mProviderField.get(v); 
         Field zoomManager = webviewclassic.getClass().getDeclaredField("mZoomManager"); 
         zoomManager.setAccessible(true); 
         Object zoomValue = zoomManager.get(webviewclassic); 
         Field defaultScale = zoomManager.getType().getDeclaredField("mDefaultScale"); 
         defaultScale.setAccessible(true); 
         defaultScale.setFloat(zoomValue, mScale); 
        } catch (Exception e2) { 
         e2.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 
} 
+0

ajouter des informations supplémentaires sur les classes. –