2010-09-13 71 views
11

当用户在输入字段或textarea中单击时,应用程序会放大。 有没有简单的方法来禁用它?有没有办法在webview中禁用输入字段的缩放功能?

目前拥有的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;" 

一切看起来不错,直到我看它的设备上Android 2.2的 具体HTC EVO 4G

+0

是否要在WebView中完全禁用缩放? – 2010-09-13 17:42:49

+0

我知道这已经有一段时间了,但是你最终设法解决了这个问题吗? TheisEgeberg的答案是否有效? – mdelolmo 2011-02-11 12:56:29

+0

这是疯了,这不起作用。老实说,如果基于文档的视口元标记的实现是正确的,我们应该能够声明一个宽度并用这个ish来完成。但相反,它根本不起作用,我们不得不求助于这些设备上的缩放问题,这会打破我们防止键盘缩放的能力! – SublymeRick 2011-11-03 06:20:45

回答

3

我搞砸了这个很多。

对于不同的屏幕尺寸和电话,你必须有不同的解决方案,完成serverside。

这适用于例如一个HTC渴望:

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

这是一个iphone:

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

在htc代码示例中,为什么在第二行中将宽度设置为640px,然后再将其设置为第三行中的相同值? – 2011-03-29 19:51:03

0

我已经得到了同样的问题(上HTC不可思议) ,还没有找到一个很好的修复。但是,我注意到的一件事是,如果您使用Google移动网站(http://google.com/m),您不会收到这种行为,我试图弄清楚为什么会出现这种情况。

我已经尝试了所有提到的stackoverflow上的修复,我可以找到,包括在这个线程上,没有任何,我发现迄今为止的作品。

一个蹩脚的修复我发现的作品是将初始缩放设置为150(1.5X),然后相应地缩放您的网站,那么你也不会得到这种缩放行为 - 也许是因为它想要缩放级别1.5X当你点击一个文本输入,如果你已经在这个缩放级别,然后没有任何反应?但是,这感觉超级黑客,并且可能在所有手机中都不健壮。

0

这是我如何解决了:

在我所有的网页我有:

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

在有输入框的页面,我有:

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

所以,我不不会从表格上获得hdpi的好处,但至少它不能放大

1

我找到了答案,至少对于 我。它适用于HTC的愿望和三星3低分辨率。

  • 从HTML中删除视口元标记。

  • 在java中应用可找到的解决方案here

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

    记住要测试是否WebSettings.ZoomDensity.FAR是提供给您的SDK版本(7及以上)。

0

有一个字段的int webview.class mDefaultScale浮 源代码显示当显示softkeyboard的mActualScale将会改变。 所以mDefaultScale是问题所在。你可以从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

你能详细解释一下吗?这是来自操作系统的源代码吗?有什么我们可以在这里做的,以解决我们的问题,或者这只是一个:“这是问题,为什么,但你不能做任何事情”有点儿? – SublymeRick 2011-11-03 06:22:43

1

这不是简单的文字大小调整问题吗?

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

它不适用于我:S – Rahnzo 2014-05-30 14:48:03

0

我知道这个线程是古老的历史,但我有结垢问题与虚拟键盘,并最终发现,在这个环节的解决方案:

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

这些行添加到应用程序的Java源

appView.getSettings().setSupportZoom(false); 
appView.getSettings().setUseWideViewPort(false); 
WebSettings ws = appView.getSettings(); 
ws.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); 
appView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); 
appView.setInitialScale(0); 
ws.setSupportZoom(false); 
ws.setBuiltInZoomControls(false); 
ws.setUseWideViewPort(false); 

我将MEDIUM更改为FAR,它将屏幕保持原来的1.0倍。

希望这节省了其他人一些搜索

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

这种方法在API级别19

这部作品在过去的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

只需设置在清单:

android:windowSoftInputMode="adjustPan" 
+0

这可以禁用缩放,但webview不会向上滚动以显示文本字段 – 2016-08-01 02:43:13

0

最后,我发现我的真实世界项目的解决方案。

- 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

添加有关类的其他信息。 – 2015-05-06 07:02:58

相关问题