淺談WebView在新視窗瀏覽網頁(setSupportMultipleWindows()與onCreateWindow()關係)

來源:互聯網
上載者:User

標籤:

一,寫在前面

我們平常使用電腦瀏覽器瀏覽網頁可能會有三種方式:

1.新視窗

2.當前視窗種的新選項卡

3.當前選項卡或者視窗

 

我們知道在電腦系統中同一時間可以開啟多個相同的進程,就像你可以同時登陸2個qq一樣,而在手機中,同一進程只能有一個在運行。

對比智能手機的瀏覽器如:QQ瀏覽器,百度瀏覽器,電腦瀏覽器中的新視窗相當於重新開啟了一個瀏覽器,而在手機中,我們是使用WebView載入網頁,雖然瀏覽器其應用進程只有一個,

但是記憶體中WebView對象可以有多個。在手機上的新視窗就是另外建立一個WebView來載入新的網頁。這種關係使得在手機上瀏覽網頁有兩種:

1.新選項卡

2.當前選項卡

上面簡單瞭解了他們的關係,下面切入正題

二,setSupportMultipleWindows與onCreatWindow

1.setSupportMultipleWindows 

我們在使用WebView時會首先對其進行初始化

WebSettings webSettings = webView.getSettings();settings.setDefaultFontSize(16);settings.setDefaultFixedFontSize(13);settings.setSupportMultipleWindows(true)...等等

再看HTML <a> 標籤的 target 屬性:

<a href="http://www.baidu.com" target="_blank">百度一下</a>

 

tartget有4個屬性:

 _blank

瀏覽器總在一個新開啟、未命名的視窗中載入目的文件。

_self

這個目標的值對所有沒有指定目標的 <a> 標籤是預設目標,它使得目的文件載入並顯示在相同的架構或者視窗中作為來源文件。這個目標是多餘且不必要的,除非和文檔標題 <base> 標籤中的 target 屬性一起使用。

_parent

這個目標使得文檔載入父視窗或者包含來超連結引用的架構的框架組。如果這個引用是在視窗或者在頂級架構中,那麼它與目標 _self 等效。

_top

這個目標使得文檔載入包含這個超連結的視窗,用 _top 目標將會清除所有被包含的架構並將文檔載入整個瀏覽器視窗。

我們只需要知道_blank屬性即可

setSupportMultipleWindows這個方法是什麼意思呢?

setSupportMultipleWindows預設的是false,也就是說WebView默人不支援新視窗,但是這個不是說WebView不能開啟多個頁面了,只是你點擊頁面上的串連,當它的target屬性是_blank時。它會在當前你所看到的頁面繼續載入那個串連。而不是重新開啟一個視窗。

當你設定為true時,就代表你想要你的WebView支援多視窗,但是一旦設定為true,必須要重寫WebChromeClient的onCreateWindow方法。

下面看看這個方法的簽名:

 

   @Override        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {                    }

仔細閱讀文檔,大家應該知道這個參數的意思:

 view :請求新視窗的WebView

isDialog : 如果是true,代表這個新視窗只是個對話方塊,如果是false,則是一個整體的大小的視窗

isUserGesture 如果是true,代表這個請求是使用者觸發的,例如點擊一個頁面上的一個串連

resultMsg ,當一個新的WebView被建立時這個只被傳遞給他,resultMsg.obj是一個WebViewTransport的對象,它被用來傳送給新建立的WebView,使用方法:

WebView.WebViewTransport.setWebView(WebView)

傳回值:這個方法如果返回true,代表這個主機應用會建立一個新的視窗,否則應該返回fasle。如果你返回了false,但是依然發送resulMsg會導致一個未知的結果。

 

如果我們僅僅是將WebView嵌入我們自己的應用然後載入網頁,很少有必要去設定支援多視窗。只在當前視窗載入新的網頁就可。

 下面是重寫onCreateWindow的必要代碼:

WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj;transport.setWebView(webview);    //此webview可以是一般新建立的      msg.sendToTarget();

 

淺談WebView在新視窗瀏覽網頁(setSupportMultipleWindows()與onCreateWindow()關係)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.