单击WebView中的表单域时禁用缩放?

时间:2011-01-28 14:51:08

标签: android webview zoom

如果有类似的问题,我已经浏览了几十页,没有任何答案,所以希望这个问题会有所不同。

我有一个webview,我不希望视图的缩放从我设置的初始缩放级别改变。 目前唯一改变缩放级别的是文本框聚焦

我需要能够通过Java代码执行此操作,而不是使用视口元标记。

就这样我没有常见的回复,我的代码中有以下内容来禁用缩放和缩放控件:

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

我认为可能的解决方案是检查在WebView中发生onFocus甚至onClick事件的时间,然后是zoomOut,但我甚至不确定这是否可能?

任何建议都将不胜感激。

9 个答案:

答案 0 :(得分:22)

更新 这个答案大约是在6年前编写的,从那时起所有新的Android版本都出现了,这很可能已经过时了。

这件事引起了很大的麻烦,但最后由于setDefaultZoom(ZoomDensity.FAR);

而得到了解决

重要的一点是在WebSettings之前调用onCreateloadUrl,否则会导致强制关闭。这里的整个代码包括导入(对于新手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);
    }
}

答案 1 :(得分:5)

我在HTC手机上通过为onScaleChanged添加一个带有空侦听器的WebViewClient来解决这个问题。我的应用程序是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 :(得分:5)

我遇到了同样的麻烦。我需要找到一种方法来将webview的内容扩展到精确值,一切正常,直到用户开始输入文本。有一些方法适用于相对较新的设备android 4.0+,但在旧的设备上失败。在任何地方都可以使用的唯一方法是将缩放值设置为不是在Java中,而是在视口中设置,如此

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

它适用于我测试的每台设备。

答案 3 :(得分:2)

您是否尝试在视口标记中禁用用户可扩展?不确定这是否适合你,但它对我有用。我不需要在java方面做任何事情。

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

答案 4 :(得分:2)

我也遇到过这个问题,我解决了这个问题:

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

它在Sumsung Galaxy Tab上正常运行。我希望这会对你有所帮助。

答案 5 :(得分:1)

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"
/>

此代码禁用放大运行Android 2.2的HTC Desire。利用HTML输入字段没有区别。

WebView / HelloWebViewClient 的整个主题以及正确处理“后退”按钮的重要提示记录在Hello Views, Web View中。任何使用WebView的人都应该阅读。

答案 6 :(得分:0)

我相信您可以使用WebView.setInitialScale方法设置缩放级别。它需要一个int作为比例,所以我想你会想做myWebView.setInitialScale(100)之类的事情。

答案 7 :(得分:0)

此问题已通过HTC设备上的固件更新修复,(显然)是由Sense UI错误地覆盖默认Android功能引起的。

很难提供有关何时更正的信息,但是当在任何具有最新固件的HTC设备上单击文本框时,我的Web应用程序不再缩放。

以下两行代码将禁用android webview的“缩放”方面:

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

答案 8 :(得分:-1)

这也让我感到头疼,但是幸运的是,我发现了这篇文章:How to stop zoom in on input focus on mobile devices

在css文件中,将输入元素中文本的字体大小设置为16px(或更多)。

  input {
        font-size: 16px;
}

这相当骇人听闻,但如果其他方法都行不通...