一般に携帯端末がH5をロードするまでには時間がかかるため、この時点でロードを追加することが多いです。
従来のアプローチ:
1. WebView が開始したばかりのときにロードを表示し、WebViewClient が onPageFinished をコールバックしたときにロードを非表示にします。
2.Webviewは最初にsetWebViewClient(mWebClient)、WebViewClientのonPageStarted()コールバックで読み込みを表示し、onPageFinished()で読み込みを非表示にします。
通常は上記の方法で問題ありませんが、読み込んだWebページにリダイレクトが発生すると、onPageStarted()とonPageFinished()が複数回実行され、この際に読み込みがちらつく問題が発生します。
解決策: 実際、onPageFinished() のコールバックで、Webview を通じて現在の進行状況を取得し、進行状況に基づいて読み込みを非表示にするかどうかを決定できます。
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = findViewById(R.id.wv_web_view);
mProgressBar = findViewById(R.id.pb_view);
showProgressBar();
initWebView();
mWebView.loadUrl("https://www.baidu.com/");
}
private void initWebView() {
mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(mWebClient);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setInitialScale(25);
WebSettings webSettings = mWebView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setDatabaseEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setAppCacheEnabled(true);
webSettings.setSupportZoom(true);
webSettings.setDefaultTextEncodingName("UTF-8");
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setUseWideViewPort(true);
webSettings.setBuiltInZoomControls(false);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webSettings.setLoadWithOverviewMode(true);
}
private WebViewClient mWebClient = new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.i("aaa", "onPageFinished progress : " + view.getProgress());
if (view.getProgress() == 100) {
hideProgressBar();
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return super.shouldOverrideUrlLoading(view, request);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
Log.i("aaa", "onReceivedError error : " + error);
hideProgressBar();
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
Log.i("aaa", "onReceivedSslError error : " + error);
hideProgressBar();
}
};
public void showProgressBar() {
if (mProgressBar != null) {
mProgressBar.setVisibility(View.VISIBLE);
}
}
public void hideProgressBar() {
if (mProgressBar != null) {
mProgressBar.setVisibility(View.GONE);
}
}
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
finish();
}
}
}