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

Отключить масштабирование при нажатии полей формы в WebView?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

// disables the actual onscreen controls from showing up
mWebView.getSettings().setBuiltInZoomControls(false);
// disables the ability to zoom
mWebView.getSettings().setSupportZoom(false);

Ответ 2

ОБНОВЛЕНИЕ. Этот ответ был написан почти 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);
    }
}

Ответ 3

Я решил это на телефонах 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), и удаление любого из них возвращается к старому, ошибочному поведению.

Ответ 4

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

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

Он работает на каждом тестируемом устройстве.

Ответ 5

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

<meta name="viewport" content="user-scalable=no, width=device-width" />

Ответ 6

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

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

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

Ответ 7

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

Решение: вам нужно добавить 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, а также важный подсказку для правильной обработки кнопки "Назад" задокументированы в Здравствуйте Просмотры, Веб-просмотр. Это должно быть необходимо для чтения для тех, кто использует WebView.

Ответ 8

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

Ответ 9

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

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

  input {
        font-size: 16px;
}

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