Подтвердить что ты не робот

Есть ли способ отключить функцию масштабирования в полях ввода в webview?

Когда пользователь нажимает кнопку ввода или текстовое поле, приложение масштабируется. Есть ли простой способ отключить его?

В настоящее время есть метатег:

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.

4b9b3361

Ответ 1

Я перепутал это много.

У вас должны быть разные решения для разных размеров экрана и телефонов, сделанные с серверов.

Это работает, например, для желания 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" />

Ответ 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);

Ответ 3

Я нашел ответ, по крайней мере, для меня. Он работает с желанием 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 и выше).

Ответ 4

Разве это не проблема с настройкой размера текста?

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

Ответ 5

Просто установите манифест:

android:windowSoftInputMode="adjustPan"

Ответ 6

У меня такая же проблема (на HTC Incredible), и пока не найдено хорошего исправления. Но я заметил, что если вы используете мобильный сайт Google (http://google.com/m), вы не получите этого поведения, я пытаюсь понять, почему это дело.

Я пробовал все исправления, упомянутые в stackoverflow, которые я мог найти, в том числе в этой теме, и ничего, что я нашел, работает до сих пор.

Одно дерьмовое исправление. Я нашел, что работа заключается в том, чтобы установить начальный масштаб на 150 (1.5X), а затем масштабировать ваш сайт соответственно, тогда вы также не получите это поведение масштабирования - может быть, потому, что ему нужен уровень масштабирования 1,5 X, когда вы нажимаете на ввод текста, и если вы уже на этом уровне масштабирования, ничего не происходит? Но, это кажется супер хаки и, вероятно, не является надежным на всех телефонах.

Ответ 7

Вот как я решил это:

На всех моих страницах у меня есть:

<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 для форм, но, по крайней мере, он не приближается к

Ответ 8

существует поле int 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);
        }

    }

Ответ 9

Я знаю, что эта ветка - это древняя история, но у меня была проблема масштабирования с виртуальной клавиатурой и, в конце концов, нашел решение по этой ссылке:

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.

Надеюсь, это спасет других людей от поиска

Ответ 10

Наконец, я нашел решение для своего реального проекта.

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