有没有办法在webview中禁用输入字段的缩放功能?

时间:2010-09-13 17:20:28

标签: android webview textinput

当用户点击输入字段或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

10 个答案:

答案 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();
                    }
                }
            }
        }
    }
}