Android WebView返回上一頁時從新加載致使頁面刷新的問題

最近碰到一個需求,用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

相關文章
相關標籤/搜索