2010-09-27 114 views
67

我想让WebView具有与android浏览器类似的行为。浏览器打开所有页面的方式会尝试将其宽度适合屏幕。但是,WebView的默认行为是以100%的像素比例开始,因此它开始放大左上角。如何设置webview的初始缩放/宽度

我花了几个小时试图找到一种方法来让WebView将页面缩放到屏幕上,就像它在浏览器中那样,但我没有任何运气。有没有人找到一种方法来实现这一点?

我看到的是一个名为setLoadWithOverviewMode的设置,但是这似乎没有做任何事情。我还尝试了setInitialScale,但是在不同的屏幕尺寸和网页尺寸下不会像浏览器缩放那样优雅。

任何人有任何线索?

感谢

编辑:布莱恩的方法似乎工作的时候,手机在横向而不是纵向。在肖像中它很接近,但仍然不适合页面中的整个屏幕。我开始这个赏金,希望有一个肯定的方式来获得初始缩放,以适应任何方向或屏幕尺寸的页面宽度。

+0

您是否找到了解决方案。 – Samuel 2011-12-13 08:02:20

+0

@Sam,下面接受的解决方案适用于我。 – cottonBallPaws 2011-12-13 16:04:54

+0

由于某种原因,我花了整整一天的时间,它只在api7中工作,而不是在上面。最后必须使用setInitialScale实现相同的功能,并手动计算初始缩放比例。顺便说一下,我有一个480x800尺寸的单一图像。 – Samuel 2011-12-14 00:59:05

回答

150

下面的代码加载谷歌主页完全缩小到webview内适合我在Android 2.2的854x480的一个像素的屏幕上的桌面版本。当我重新调整设备的方向并重新加载纵向或横向时,页面宽度每次都完全适合视图。

BrowserLayout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <WebView android:id="@+id/webview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
</LinearLayout> 

Browser.java:

import android.app.Activity; 
import android.os.Bundle; 
import android.webkit.WebView; 

public class Browser extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.BrowserLayout); 

     String loadUrl = "http://www.google.com/webhp?hl=en&output=html"; 

     // initialize the browser object 
     WebView browser = (WebView) findViewById(R.id.webview); 

     browser.getSettings().setLoadWithOverviewMode(true); 
     browser.getSettings().setUseWideViewPort(true); 

     try { 
      // load the url 
      browser.loadUrl(loadUrl); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

感谢Brian,这似乎是乍一看工作。我会在奖励赏金之前测试更多网站,但这看起来很有希望! – cottonBallPaws 2010-12-01 15:28:02

+0

这是一个很好的解释。 +1 – Tarik 2010-12-02 21:13:57

+0

好的答案+ 1 – DeRagan 2010-12-03 13:32:11

6

尝试using a wide viewport

webview.getSettings().setUseWideViewPort(true); 
+1

谢谢,这似乎是在正确的方向。这本身似乎没有做任何事情,但与setInitialScale(50)的组合,它完美的肖像。但是,将手机放在横向位置,不适合屏幕显示。除了那个之外,还有其他设置我应该使用吗?这是我目前的:setBuiltInZoomControls(true),setUseWideViewPort(true),setInitialScale(50)。无论屏幕的大小或密度如何,我都希望它适合屏幕。再次感谢。 – cottonBallPaws 2010-09-28 19:30:41

+0

不适用于我.. – 2015-06-16 07:06:14

2

为//图像和SWF影片中使用宽度为 “100%” 和高度为 “98%”

mWebView2.getSettings().setJavaScriptEnabled(true); 
mWebView2.getSettings().setLoadWithOverviewMode(true); 
mWebView2.getSettings().setUseWideViewPort(true); 
mWebView2.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
mWebView2.setScrollbarFadingEnabled(true); 
+3

为什么身高在98%? – hotshot309 2012-07-02 14:55:15

+0

你能帮我在这个https://stackoverflow.com/questions/49098464/loading-gif-in-webview-not-adjusting-to-webview – Stuart2041 2018-03-05 19:34:50

19

我想出了为什么纵向视图不能完全填充视口。至少在我的情况下,这是因为滚动条总是显示。除了以上的视代码,你可以添加以下:

browser.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
    browser.setScrollbarFadingEnabled(false); 

这会导致滚动条不占用布局空间,并允许网页以填充视口。

希望这有助于

9

这是老问题,但让我万一添加一个细节更喜欢我的人来到这里。

Brian发布的优秀答案在Jelly Bean中不适合我。我还必须添加:

browser.setInitialScale(30); 

该参数可以是任何百分比,表示调整大小的内容小于webview宽度。然后setUseWideViewPort(true)将内容宽度扩展到webview宽度的最大值。

+0

我在webview中显示的网页由很多Javascript组成,它更像电视中的OSD,带按钮的小部件。 我用你的解决方案,我有2意见: 1.第一次加载的webview是不成功的,webview是黑色的 2.第二个是正确的,但我可以双击,这是我不想要的东西,因为它缩放了小部件和按钮,然后停止工作。你可以提供什么帮助?谢谢。 – MartinC 2013-10-25 12:12:23

+0

应该注意,WebView.setInitialScale(int)的默认值是0而不是100. [链接到文档](https://developer.android.com/reference/android/webkit/WebView.html# setInitialScale(INT)) – DBX12 2016-09-26 10:46:56

1

我正在为这个答案加载图片,我希望它们被缩放到设备的宽度。我发现,对于版本低于API 19(KitKat)的老款手机,Brian的答案并不像我喜欢的那样。它在旧手机上的一些图像周围留出大量空白,但适用于我的新手机。这是我的另一种选择,在这个答案的帮助下:Can Android's WebView automatically resize huge images?布局算法SINGLE_COLUMN已被弃用,但它的工作原理,我觉得适合使用旧的webviews。

WebSettings settings = webView.getSettings(); 

// Image set to width of device. (Must be done differently for API < 19 (kitkat)) 
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
    if (!settings.getLayoutAlgorithm().equals(WebSettings.LayoutAlgorithm.SINGLE_COLUMN)) 
     settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); 
} else { 
    if (!settings.getLoadWithOverviewMode()) settings.setLoadWithOverviewMode(true); 
    if (!settings.getUseWideViewPort()) settings.setUseWideViewPort(true); 
}