最近碰到一個需求,用WebView加載頁面,選擇了篩選條件以後,跳轉到新的webVIew頁面以後再返回,原來的篩選條件因爲頁面刷新致使已經清空,怎樣才能解決返回的時候不去從新加載頁面呢,網上不少答案是設置webView頁面緩存,可是對部分h5頁面仍是沒有效果。java
也有的博客說能夠每次跳轉到新的url的時候,能夠addView 一個webView,返回的時候就回到上一個webView,這種方法是可行的,可是若是添加的webView過多,返回的時候,可能會出現問題,最後經過觀察瀏覽器的實現方法發現,從urlA跳轉到urlB,好像是從新打開了一個新的activity,而後返回的時候就直接finsh當前activity,這樣就解決了上面的這個問題。web
因此,最終方案就是每次加載新的url的時候,就會跳轉到一個新的activity頁面,咱們重寫WebViewClient的shouldOverrideUrlLoading方法,在該方法中攔截url跳轉到新頁面,具體代碼:瀏覽器
llWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(p0: WebView?, p1: String?):Boolean {
//攔截url,跳轉到新的activity頁面打開url
val intent = Intent(this, WebViewActivity::class.java)
intent.putExtra("url", url)
toIntent(intent)
return true
}
}
複製代碼
而後運行以後發現另一個問題,當頁面重定向以後,會先打開一個空白的頁面,而後再打開一個重定向以後的頁面,而後返回的時候用戶就會看到中間存在空白頁面,要想解決這個問題,就首先應該要知道那些url重定向,若是知道了某個url會重定向,咱們只須要判斷重定向的url不執行跳轉就能夠解決這個問題了。緩存
經過對重定向url的Log打印發現一個規律:若是該連接發生了重定向,回調shouldOverrideUrlLoading會在回調onPageFinished以前。沒有重定向的連接,則相反。經過這個結論,咱們能夠定義一個變量來標識該連接是否重定向,而後就能夠進行判斷,具體代碼:bash
var mIsRedirect: Boolean = false //用來標識連接是否重定向
llWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(p0: WebView?, p1: String?):Boolean {
//攔截url,跳轉到新的activity頁面打開url
val intent = Intent(this, WebViewActivity::class.java)
intent.putExtra("url", url)
toIntent(intent)
return true
}
override fun onPageStarted(p0: WebView?, p1: String?, p2: Bitmap?) {
super.onPageStarted(p0, p1, p2)
mIsRedirect = true
}
override fun onPageFinished(p0: WebView?, p1: String?) {
super.onPageFinished(p0, p1)
mIsRedirect = false
}
}
複製代碼
這樣就能夠像瀏覽器同樣,返回webView頁面的時候,不會去刷新頁面,頁面狀態不會重置。ide