如果有类似的问题,我已经浏览了几十页,没有任何答案,所以希望这个问题会有所不同。
我有一个webview,我不希望视图的缩放从我设置的初始缩放级别改变。 目前唯一改变缩放级别的是文本框聚焦。
我需要能够通过Java代码执行此操作,而不是使用视口元标记。
就这样我没有常见的回复,我的代码中有以下内容来禁用缩放和缩放控件:
mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setSupportZoom(false);
我认为可能的解决方案是检查在WebView中发生onFocus甚至onClick事件的时间,然后是zoomOut,但我甚至不确定这是否可能?
任何建议都将不胜感激。
答案 0 :(得分:22)
更新 这个答案大约是在6年前编写的,从那时起所有新的Android版本都出现了,这很可能已经过时了。
这件事引起了很大的麻烦,但最后由于setDefaultZoom(ZoomDensity.FAR);
重要的一点是在WebSettings之前调用onCreate
和loadUrl
,否则会导致强制关闭。这里的整个代码包括导入(对于新手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;
}
这相当骇人听闻,但如果其他方法都行不通...