当用户点击输入字段或textarea时,应用程序会放大。 是否有一种简单的方法可以禁用它?
目前有元标记:
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 :(得分:3)
我搞砸了很多。
您必须针对不同的屏幕尺寸和手机提供不同的解决方案,并在服务器端完成。
这适用于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 :(得分: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);
答案 2 :(得分:1)
我找到了答案,至少对我而言。它适用于HTC欲望和Sansung 3低分辨率。
从HTML中删除视口元标记。
在java中应用可以找到的解决方案here。
this.appView.getSettings().setSupportZoom( true ); //Modify this
this.appView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);//Add this
请务必测试您的SDK版本(7及以上版本)是否有WebSettings.ZoomDensity.FAR
。
答案 3 :(得分:1)
这不仅仅是文字大小的调整问题吗?
body{
-webkit-text-size-adjust:none;
}
答案 4 :(得分:1)
只需在清单中设置:
android:windowSoftInputMode="adjustPan"
答案 5 :(得分:0)
我遇到了同样的问题(在HTC Incredible上),还没有找到一个好的解决方案。但是,有一点我注意到,如果你使用谷歌手机网站(http://google.com/m),你没有得到这种行为,我试图弄清楚为什么会这样。
我已经尝试了我能找到的stackoverflow上提到的所有修复,包括在这个帖子上,到目前为止我找不到任何工作。
一个糟糕的修复我发现工程是将初始比例设置为150(1.5X),然后相应地缩放你的网站,然后你也没有得到这种缩放行为 - 也许是因为它想要一个1.5的缩放级别单击文本输入时的X,如果您已经处于该缩放级别,则没有任何反应?但是,这感觉超级hacky并且在所有手机上可能都不健壮。
答案 6 :(得分: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中受益,但至少它没有放大
答案 7 :(得分:0)
webview.class mDefaultScale float中有一个字段 源代码显示,当您显示软键盘时,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);
}
}
答案 8 :(得分: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放大倍率。
希望能为其他人节省一些搜索费用
答案 9 :(得分: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();
}
}
}
}
}
}