11

当用户单击输入字段或文本区域时,应用程序会放大。有没有简单的方法来禁用它?

目前有元标记:

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的设备上查看它。

4

10 回答 10

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" />
于 2010-11-02T08:32:06.643 回答
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);
于 2014-08-08T04:18:41.730 回答
1

这不只是一个文本大小调整问题吗?

body{ 
    -webkit-text-size-adjust:none; 
}
于 2011-09-20T20:34:10.217 回答
1

我找到了答案,至少对我来说。它适用于 HTC 欲望和 Sansung 3 低分辨率。

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

  • 在 java 中应用可以在此处找到的解决方案。

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

    请记住测试是否WebSettings.ZoomDensity.FAR适用于您的 SDK 版本(7 及更高版本)。

于 2011-06-20T01:37:20.763 回答
1

只需在清单中设置:

android:windowSoftInputMode="adjustPan"
于 2015-02-23T21:35:59.167 回答
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 放大倍率。

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

于 2012-12-29T23:25:16.730 回答
0

我遇到了同样的问题(在 HTC Incredible 上),但还没有找到好的解决方法。但是,我注意到的一件事是,如果您使用 Google 移动网站 (http://google.com/m),您不会出现这种行为,我正试图弄清楚为什么会出现这种情况。

我已经尝试了在 stackoverflow 上提到的所有我能找到的修复,包括在这个线程上,到目前为止我发现没有任何修复。

我发现的一个糟糕的解决方法是将初始比例设置为 150 (1.5X),然后相应地缩放您的网站,然后您也不会得到这种缩放行为 - 可能是因为当您需要 1.5X 的缩放级别时单击文本输入,如果您已经处于该缩放级别,那么什么也没有发生?但是,这感觉超级hacky,并且可能在所有手机上都不是很强大。

于 2011-04-01T14:43:36.303 回答
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 中受益,但至少它不会放大

于 2011-05-16T14:51:53.710 回答
0

在 WebViewClassic.java 中,如果实际比例小于默认比例,则displaySoftKeyboard会放大和平移。WebWiew.class mDefaultScale float 中有一个字段,源代码显示当您显示软键盘时,mActualScale 会发生变化。

因此,确保 mActualScale >= mDefaultScale 应该可以防止平移和重新缩放。(以下是来自 grepcode 站点的 WebView.java 的源代码——该站点不再运行。)

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);
        }

    }

frameworks/base/core/java/android/webkit/WebViewClassic.java(对于 JellyBean api 17)中的 googleSource--WebViewClassic.java 的代码显示了类似的功能

/**
 * Called in response to a message from webkit telling us that the soft
 * keyboard should be launched.
 */
private void displaySoftKeyboard(boolean isTextView) {
    InputMethodManager imm = (InputMethodManager)
            mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
    // bring it back to the default level scale so that user can enter text
    boolean zoom = mZoomManager.getScale() < mZoomManager.getDefaultScale();
    if (zoom) {
        mZoomManager.setZoomCenter(mLastTouchX, mLastTouchY);
        mZoomManager.setZoomScale(mZoomManager.getDefaultScale(), false);
    }
    // Used by plugins and contentEditable.
    // Also used if the navigation cache is out of date, and
    // does not recognize that a textfield is in focus.  In that
    // case, use WebView as the targeted view.
    // see http://b/issue?id=2457459
    imm.showSoftInput(mWebView, 0);
}
于 2011-08-27T11:21:21.493 回答
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();
                    }
                }
            }
        }
    }
}
于 2015-05-06T06:53:26.770 回答