Skip to content

Instantly share code, notes, and snippets.

@gnumilanix
Last active June 2, 2017 01:52
Show Gist options
  • Save gnumilanix/1b40bfea1185e4697de84e4413fa2e11 to your computer and use it in GitHub Desktop.
Save gnumilanix/1b40bfea1185e4697de84e4413fa2e11 to your computer and use it in GitHub Desktop.
Implementation of WebViewClient that can be used to monitor/show/hide progress
import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
* Extension of {@link WebViewClient} that can update caller about changes in the loading progress
*
* @author milan
*/
public class ProgressChromeClient extends WebViewClient {
private final ProgressListener progressBar;
public ProgressChromeClient(ProgressListener progressBar) {
this.progressBar = progressBar;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.showProgress(view, -1);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressBar.hideProgress(view);
}
@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
progressBar.hideProgress(view);
}
@TargetApi(android.os.Build.VERSION_CODES.M)
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
progressBar.hideProgress(view);
}
}
import android.webkit.WebView;
/**
* Interface to be implemented by callers that requires to listen to progress changes
*
* @author milan
*/
public interface ProgressListener {
/**
* Invoked when progress needs to be shown
*
* @param view that needs an update
* @param progress value
*/
void showProgress(WebView view, int progress);
/**
* Invoked when progress needs to be hidden
*
* @param view that needs an update
*/
void hideProgress(WebView view);
}

Set a WebViewClient with WebView.setWebViewClient and you are free to use any kind of progress views

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.ProgressBar;

import com.milanix.view.ProgressChromeClient;
import com.milanix.view.ProgressListener;

/**
 * Fragment to display a web page with a progress
 *
 * @author milan
 */
public class WebPageFragment extends Fragment implements ProgressListener {
    protected WebView webView;
    protected ProgressBar progressBar;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        webView.setWebViewClient(new ProgressChromeClient(this));
    }

    @Override
    public void showProgress(WebView view, int progress) {
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideProgress(WebView view) {
        progressBar.setVisibility(View.GONE);
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment