一,寫在前面
我們平常使用電腦瀏覽器瀏覽網頁可能會有三種方式:
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();