項目中有牽涉新聞的部分,新聞裏面用的是WebView和RecyclerView
因爲惠引入很多三方的web地址,部分WebView出現底部白屏,也有二級頁白屏的問題(這個是因爲自身原因,重定向後沒有重新設置高度)
找了相關資料,總算是給解決了
以下是解決白屏的代碼
首先在JavascriptInterface 裏面註冊一個 重新設置WebView的方法
public class BaseFunc {
public BaseFunc(Activity mActivity, WebView webView)
{ this.mActivity = mActivity;
this.webView = webView;
}
//註冊一個重新計算高度的方法
@JavascriptInterface
public void resize(final float height) {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
webView.setLayoutParams(new RelativeLayout.LayoutParams(mActivity.getResources().getDisplayMetrics().widthPixels, (int) (height * mActivity.getResources().getDisplayMetrics().density))); } }); }
}
以下是WebView頁面中的代碼
/** * 初始化js調用本地的方法 basefunc.goNative */
@SuppressLint("JavascriptInterface")
private void initJSExeLocaMethod() {
baseFunc = new BaseFunc(Activity.this, mWebView);
// --------html調用我們本地方法-----------
mWebView.addJavascriptInterface(baseFunc, "abc");
}
在WebView中的WebViewClient中實現onPageFinished
@Override
public void onPageFinished(WebView webView, String s) {
//網頁加載完後,重新計算高度
mWebView.loadUrl("javascript:abc.resize(document.body.getBoundingClientRect().height)");
super.onPageFinished(webView, s);
}
經過以上處理,絕大多數白屏問題就解決了
在WebChromeClient中onProgressChanged和WebViewClient中onPageFinished都能監聽網頁的加載完成,但是onPageFinished會執行的比較晚,所以最好在onPageFinished方法裏面處理比較穩妥。
document.body.getBoundingClientRect().height //獲取WebView中body的高度