2010-09-27 93 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); 
}