Отключить масштабирование при нажатии на поля формы в WebView? - PullRequest
17 голосов
/ 28 января 2011

Я просмотрел десятки страниц, если похожие вопросы, ни на один из них нет ответов, так что, надеюсь, этот будет другим.

У меня есть веб-просмотр, и я не хочу, чтобы масштабирование изменялось по сравнению с исходным уровнем масштабирования, установленным для него. Единственное, что в настоящее время изменяет уровень масштабирования, это когда текстовое поле сфокусировано .

Мне нужно сделать это через код Java, не используя метатег viewport.

Просто у меня нет общих ответов, в моем коде есть следующее, чтобы отключить масштабирование, и элементы управления масштабированием:

mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setSupportZoom(false);

Я думаю, что возможное решение состоит в том, чтобы проверить, происходит ли событие onFocus или даже onClick в WebView, а затем zoomOut, но я даже не уверен, возможно ли это?

Любые предложения будут оценены.

Ответы [ 9 ]

22 голосов
/ 23 октября 2011

ОБНОВЛЕНИЕ Этот ответ был написан почти 6 лет назад, со всеми новыми версиями Android, появившимися с тех пор, скорее всего, он устарел.

Эта вещь вызвала сильную головную боль, но, наконец, была решена благодаря setDefaultZoom(ZoomDensity.FAR);

Одна важная вещь заключается в том, что onCreate и loadUrl вызывают до WebSettings, в противном случае это вызвало принудительное закрытие ситуации. Здесь код ENTIRE , включая импорт (для начинающих пользователей Java)

package com.my.app;

import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebSettings.ZoomDensity;

import com.phonegap.*;

public class MyDroidActivity extends DroidGap {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html");
        WebSettings settings = appView.getSettings();
        settings.setBuiltInZoomControls(false);
        settings.setSupportZoom(false);
        settings.setDefaultZoom(ZoomDensity.FAR);
    }
}
5 голосов
/ 09 ноября 2012

У меня была такая же проблема.Мне нужно было найти способ масштабировать содержимое веб-просмотра до точного значения, все работало нормально, пока пользователь не начал вводить текст.Существуют методы, которые работают на относительно новых устройствах Android 4.0+, но не работают на старых.Единственный способ, который работает везде, это установить значение масштабирования не в Java, а в окне просмотра, как это

<meta name="viewport" content="initial-scale=.80; maximum-scale=.80; minimum-scale=.80;" />

. Это работает на каждом устройстве, которое я тестировал.

5 голосов
/ 02 сентября 2011

Я решил эту проблему на телефонах HTC, добавив WebViewClient с пустым слушателем для onScaleChanged.Мое приложение - PhoneGap, так оно и выглядит, но добавление слушателя должно выглядеть одинаково в приложении, отличном от PhoneGap:

public class Main extends DroidGap {

private class NoScaleWebViewClient extends GapViewClient {

    public NoScaleWebViewClient(DroidGap ctx) {
        super(ctx);
    }

    public void onScaleChanged(WebView view, float oldScale, float newScale) {
        Log.d("NoScaleWebViewClient", "Scale changed: " + String.valueOf(oldScale) + " => " + String.valueOf(newScale));
    }
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.init();
    setWebViewClient(appView, new NoScaleWebViewClient(this));
    // disables the actual onscreen controls from showing up
    appView.getSettings().setBuiltInZoomControls(false);
    // disables the ability to zoom
    appView.getSettings().setSupportZoom(false);
    appView.getSettings().setDefaultZoom(ZoomDensity.FAR);
    appView.setInitialScale(100);
}

}

Как ни странно, слушатель onScaleChange никогдавызывается - прислушиваясь к зуму, он блокирует увеличение.Я обнаружил, что мне нужны все другие вызовы (setSupportZoom, setDefaultZoom, setInitialScale), чтобы это работало, и удаление любого из них возвращает к старому, ошибочному поведению.

2 голосов
/ 07 июня 2011

Я тоже столкнулся с этой проблемой, и решил ее так:

myWebview.getSettings().setDefaultZoom(ZoomDensity.FAR);

Он нормально работает на Sumsung Galaxy Tab.Я надеюсь, что это поможет вам.

2 голосов
/ 16 февраля 2011

Вы пытались отключить масштабирование пользователя в теге viewport?Не уверен, что это будет работать для вас, но это работает для меня.Мне не нужно было ничего делать на стороне Java.

<meta name="viewport" content="user-scalable=no, width=device-width" />
1 голос
/ 20 февраля 2011

В WebView есть одна особая «вещь», которая, я думаю, вызовет здесь много вопросов и ответов. В результате при загрузке URL-адреса браузер Android по умолчанию запускает Intent для обработки этого. масштабирование принимает участие в этом браузере , а не в вашем веб-представлении.

Решение: вам нужно добавить WebviewClient , чтобы сообщить Android, что вы сами управляете просмотром. Пример:

// Use WebView and disable zooming

public class MyWebView extends Activity {
    // nested class
    private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true
        }
    }

    private WebView mWebView;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView) findViewById(R.id.webview);
        mWebView.setWebViewClient(new HelloWebViewClient());
        mWebView.setInitialScale(500);   // added after user comment

        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setBuiltInZoomControls(false);
        mWebView.getSettings().setSupportZoom(false);

        mWebView.loadUrl("http://www.google.com");      

    }
}

Мой main.xml выглядит так

<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

Этот код отключил масштабирование на моем HTC Desire под управлением Android 2.2. Нажатие на поля ввода HTML не имеет значения.

Вся тема WebView / HelloWebViewClient , а также важный совет по правильной обработке кнопки «Назад» задокументированы в Hello Views, Web View . Это необходимо для чтения всем, кто использует WebView.

0 голосов
/ 10 мая 2019

Это тоже было головной болью для меня, но, к счастью, я нашел эту статью: Как остановить увеличение фокусировки на мобильных устройствах .

Установите размер шрифта текста в элементе ввода равным 16px (или более) в файле css.

  input {
        font-size: 16px;
}

Это скорее взлом, но если ничего другого не работает ...

0 голосов
/ 02 июня 2011

Эта проблема была исправлена ​​обновлением прошивки на устройствах HTC, оно (по-видимому) было вызвано тем, что пользовательский интерфейс Sense неправильно переопределял функциональность Android по умолчанию.

Очень трудно предоставить информацию о том, когдабыло исправлено, однако мое веб-приложение больше не масштабируется при нажатии текстового поля на любом устройстве HTC с последней версией прошивки.

Следующие две строки кода отключат аспекты «масштабирования» веб-просмотра Android:

// disables the actual onscreen controls from showing up
mWebView.getSettings().setBuiltInZoomControls(false);
// disables the ability to zoom
mWebView.getSettings().setSupportZoom(false);
0 голосов
/ 21 февраля 2011

Полагаю, вы можете установить уровень масштабирования с помощью метода WebView.setInitialScale.Он принимает int как масштаб, так что я думаю, вы захотите сделать что-то вроде myWebView.setInitialScale(100).

...