記一次WebView使用異常,點擊搜索引擎頁內的超鏈接,無法跳轉到相應的頁面

事情是這樣的,有業務需求需要使用yandex(www.yandex.ru)這個搜索引擎搜索內容,在自己的activity裏面創建了一個webview,webview load這個搜索引擎搜索關鍵字(隨便一個關鍵字都可以),大概界面如下:



隨便點擊其中的鏈接項,正常情況下希望能load出具體的網頁,並且正常情況下,如果我們複寫了WebViewClient那麼必然會調用shouldOverrideUrlLoading方法。然而事實上我怎麼點擊都沒用,沒反應,但是又不像anr,因爲我還可以上下滑動,加載更多的搜索項,以及點擊頁面的其他按鈕,並且shouldOverrideUrlLoading也沒有回調。

起初是懷疑是不是這個搜索引擎有問題,於是換成了百度搜索,結果沒什麼問題,很正常的進行跳轉。而且,在其他瀏覽器裏面使用yandex搜索,也沒什麼問題,會正常的跳轉。也就是說瀏覽器和搜索引擎都沒什麼問題。那問題究竟出現在哪裏呢?

我們來看兩種動圖,分別使用yandex和百度搜索關鍵字,都是在chrome瀏覽器裏面進行的:



注意看瀏覽器點擊鏈接後的的tab的反應,在yandex搜索中點擊鏈接後,tab(右上角)變成了2,而百度搜索點擊連接後tab還是原來的1。說明瀏覽器在兩個搜索結果的跳轉上是有差別的,前者相當於是新建了一個webview來加載新的鏈接,而後者則是在原有的webview上加載,並且會回調shouldOverrideUrlLoading方法。

搜索之前代碼的提交記錄,有這麼一個註釋引起了我的注意:


原來之前早就有人踩過了這個坑,可惜後來合併分支又把之前註釋掉的代碼還原了。 o(╯□╰)o

那麼這個setSupportMultipleWindows方法到底是什麼作用呢?從字面意思來看就是支持多窗口(也就是支持多個webview),具體可移步這裏學習下:淺談WebView在新窗口瀏覽網頁(setSupportMultipleWindows()與onCreateWindow()關係)

大體上來說就是,默認情況下webSettings.setSupportMultipleWindows(false)是被設置爲false的(也就是我們什麼都不做的情況下),一旦我們設置爲true,並且網頁的鏈接裏面tartget的屬性爲_blank,那麼當我們點擊鏈接的時候,就會在另外一個窗口(webview)中來加載網頁。之所以我的webview不能加載yandex的鏈接,就是因爲我設置了setSupportMultipleWindows(true)支持多窗口模式,yandex的鏈接中包含_blank屬性(可以看紅圈裏的:


),而實際上我就只有一個webview(業務處理不像瀏覽器那樣可以支持多個窗口,只希望所有的網頁加載都在一個webview中),並沒有相應的處理多個webview的情況。所以就有點了鏈接之後無響應的錯覺。

所以想要解決這個問題,非常簡單的就是註釋掉那個支持多窗口的設置,讓所有的網頁都在一個webview裏面加載。奏是這麼簡單了~o(╯□╰)o


最後,附上一份ubuntu上錄製視頻並轉換爲gif的方法:

基本上是參考這篇文章:Ubuntu下錄製 和 製作 Gif 圖片

首先,得裝3個軟件,我使用AS錄製手機操作視頻,所以免了第一步,

1.Install softwares

(1)sudo apt-get install kazam

(2)sudo apt-get install mplayer

(3)sudo apt-get install imagemagick

然後使用如下命令轉換成gif:

2.Convert to Gif

(1)Generate JPEG pictures

~/Videos$ mplayer -ao null Kazam_screencast_00000.mp4 -vo jpeg:outdir=./tabs

(2)Generate Gif

~/Videos$ convert ./tabs/*.jpg -resize 63% progress.gif

可以把百分值調低點