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