{"id":524,"date":"2021-05-02T04:46:03","date_gmt":"2021-05-02T03:46:03","guid":{"rendered":"https:\/\/codeflarelimited.com\/blog\/?p=524"},"modified":"2025-04-22T15:41:54","modified_gmt":"2025-04-22T14:41:54","slug":"create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure","status":"publish","type":"post","link":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/","title":{"rendered":"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure"},"content":{"rendered":"\n<p class=\"yoast-reading-time__wrapper\"><span class=\"yoast-reading-time__icon\"><\/span><span class=\"yoast-reading-time__descriptive-text\">Estimated reading time:  <\/span><span class=\"yoast-reading-time__reading-time\">7<\/span><span class=\"yoast-reading-time__time-unit\"> minutes<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-is-a-webview\">What is a WebView?<\/h2>\n\n\n\n<p>A WebView is an embeddable browser that helps a native application, such as Android, to display web content. If you are writing an application that needs to deliver a web content or show a web page as a part of a client application, you can do it smoothly and efficiently using WebView.<\/p>\n\n\n\n<p><a href=\"https:\/\/truthpost.info\/how-to-get-hired-at-us-tech-firms-as-a-nigerian-developer\/\">How to Get Hired at US Tech Firms as a Nigerian Developer<\/a>.<\/p>\n\n\n\n<p>According to the <a href=\"https:\/\/developer.android.com\/guide\/webapps\/webview\" target=\"_blank\" rel=\"noreferrer noopener\">Android Studio documentation<\/a>, the&nbsp;<code>WebView<\/code>&nbsp;class is an extension of Android&#8217;s&nbsp;<code>View<\/code>&nbsp;class that allows you to display web pages as a part of your activity layout. It does&nbsp;<em>not<\/em>&nbsp;include any features of a fully developed web browser, such as navigation controls or an address bar. All that&nbsp;<code>WebView<\/code>&nbsp;does, by default, is show a web page.<\/p>\n\n\n\n<p>In this article, we shall see how to:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Use Android&#8217;s native webView wrapper to load site&#8217;s url<\/li>\n\n\n\n<li>Add and dismiss progressBar<\/li>\n\n\n\n<li>Utilize the Swipe to refresh feature of Android&#8217;s webView.<\/li>\n\n\n\n<li>Add a custom error page on network failure.<\/li>\n<\/ol>\n\n\n\n<p><strong>Let us begin &#8230;<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-1-open-up-your-android-studio-and-select-empty-activity\">Step 1: Open up your Android Studio and select Empty Activity<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"650\" src=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/android.png\" alt=\"\" class=\"wp-image-526\" srcset=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/android.png 900w, https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/android-300x217.png 300w, https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/android-768x555.png 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><figcaption class=\"wp-element-caption\">Android Studio Project Setup<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-2-add-the-following-dependency-in-build-gradle-file-inside-the-app-folder\">Step 2: Add the following dependency in <em>build.gradle<\/em> file inside the <em>app folder<\/em><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">implementation 'com.google.android.material:material:1.0.0'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-3-sync-project-with-gradle-files\">Step 3: Sync project with <em>gradle<\/em> files<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"438\" height=\"666\" src=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/sync.jpeg\" alt=\"\" class=\"wp-image-527\" srcset=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/sync.jpeg 438w, https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/sync-197x300.jpeg 197w\" sizes=\"auto, (max-width: 438px) 100vw, 438px\" \/><figcaption class=\"wp-element-caption\">Sync Project With Gradle Files<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-4-add-the-following-code-to-your-activity_main-xml-file-in-res-layout-folder\">Step 4: Add the following code to your <em>activity_main.xml <\/em>file in res-&gt;layout folder<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;RelativeLayout\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\"&gt;\n\n   &lt;androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n       android:id=\"@+id\/swipe\"\n       android:layout_width=\"match_parent\"\n       android:layout_height=\"match_parent\"\n       tools:layout_behavior=\"@string\/appbar_scrolling_view_behavior\"&gt;\n\n\n\n       &lt;WebView\n           android:id=\"@+id\/web\"\n           android:layout_width=\"match_parent\"\n           android:layout_height=\"match_parent\"\/&gt;\n\n\n   &lt;\/androidx.swiperefreshlayout.widget.SwipeRefreshLayout&gt;\n\n\n    &lt;ProgressBar\n        android:id=\"@+id\/progress\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerVertical=\"true\"\n        android:layout_centerHorizontal=\"true\"\n        style=\"?android:attr\/progressBarStyle\"\n        \/&gt;\n\n&lt;\/RelativeLayout&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-5-we-will-go-to-our-mainactivity-java-file-and-add-the-code-to-display-the-webview\">Step: 5 We will go to our <em>MainActivity.java<\/em> file and add the code to display the WebView<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">public class MainActivity extends AppCompatActivity {\n\n    WebView webView;\n    ProgressBar progressBar;\n    SwipeRefreshLayout swipeRefreshLayout;\n\n    @SuppressLint(\"SetJavaScriptEnabled\")\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        getSupportActionBar().hide();\n\n        webView = findViewById(R.id.web);\n        progressBar = findViewById(R.id.progress);\n        swipeRefreshLayout = findViewById(R.id.swipe);\n\n\n        webView.getSettings().setJavaScriptEnabled(true);\n        webView.getSettings().setSupportZoom(false);\n        webView.getSettings().setDomStorageEnabled(true);\n        webView.setWebViewClient(new myWebViewclient());\n        webView.loadUrl(\"http:\/\/codeflarelimited.com\");\n}\n}<\/code><\/pre>\n\n\n\n<p>Here we setting up our basic WebView and just passing the url we want to wrap. Notice also that we have initialized the SwipeRefreshLayout, and that&#8217;s all we are doing here. We need to make it show and dismiss it when the page is fully loaded.<\/p>\n\n\n\n<p>So we add the following code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\"> swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                swipeRefreshLayout.setRefreshing(true);\n                new Handler().postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        swipeRefreshLayout.setRefreshing(false);\n                        webView.loadUrl(\"http:\/\/codeflarelimited.com\");\n                    }\n                },  3000);\n            }\n        });\n\n        swipeRefreshLayout.setColorSchemeColors(\n                getResources().getColor(android.R.color.holo_blue_bright),\n                getResources().getColor(android.R.color.holo_orange_dark),\n                getResources().getColor(android.R.color.holo_green_dark),\n                getResources().getColor(android.R.color.holo_red_dark)\n        );\n\n    }<\/code><\/pre>\n\n\n\n<p>Notice we are also using WebViewClient. The <em>WebViewClient<\/em>&nbsp;allows us to handle navigation inside the&nbsp;<em>WebView<\/em>&nbsp;and to also handle the various events generated by the&nbsp;<em>WebView<\/em>. It is also in this WebViewClient block that we want to check for errors, network errors, SSL errors, etc.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.codeflare\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"500\" src=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/09\/origami-banner.png\" alt=\"build mobile apps in abuja\" class=\"wp-image-767\" srcset=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/09\/origami-banner.png 1024w, https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/09\/origami-banner-300x146.png 300w, https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/09\/origami-banner-768x375.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>We want to be able to handle errors in a nice and responsible way. So we&#8217;ll add the following code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">public class myWebViewclient extends WebViewClient{\n\n        @Override\n        public boolean shouldOverrideUrlLoading(WebView view, String url) {\n            view.loadUrl(url);\n            return true;\n        }\n\n        @Override\n        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {\n            Toast.makeText(getApplicationContext(), \"No internet connection\", Toast.LENGTH_LONG).show();\n            webView.loadUrl(\"file:\/\/\/android_asset\/lost.html\");\n        }\n\n        @Override\n        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {\n            super.onReceivedSslError(view, handler, error);\n            handler.cancel();\n        }\n\n        @Override\n        public void onPageStarted(WebView view, String url, Bitmap favicon) {\n            super.onPageStarted(view, url, favicon);\n            progressBar.setVisibility(View.VISIBLE);\n        }\n\n        @Override\n        public void onPageFinished(WebView view, String url) {\n            super.onPageFinished(view, url);\n            progressBar.setVisibility(View.GONE);\n        }\n    }<\/code><\/pre>\n\n\n\n<p>Now, let us explain what&#8217;s happening here. First we&#8217;re handling navigation here within the WebVeiw because of this line of code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\"> public boolean shouldOverrideUrlLoading(WebView view, String url) {\n            view.loadUrl(url);\n            return true;\n        }<\/code><\/pre>\n\n\n\n<p><strong>This ensures that whatever url that is loaded in the WebView opens up in the WebVeiw and does not navigate away or open up chrome or other web browser.<\/strong><\/p>\n\n\n\n<p>Next, we have the <strong><em>onReceivedError<\/em><\/strong> method. This is where we check for error, and to handle that we have created an offline html file that will load when the app encounters a network failure.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-don-t-forget-to-handle-back-navigation-for-the-webview\">Don&#8217;t forget to handle Back Navigation for the WebView!<\/h3>\n\n\n\n<p>The default behaviour of webView applications, especially in Android, is that once you press the back button it closes the application. But what if we have visited several pages and we want to go back to the previous page?<\/p>\n\n\n\n<p>So we need to handle the back navigation and just say if the webView has previous pages and <strong><em>canGoBack()<\/em><\/strong>, let it just <strong><em>goBack()<\/em><\/strong>. We&#8217;ll add the following code as well:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\"> @Override\n    public boolean onKeyDown(int keyCode, KeyEvent event) {\n\n        if ((keyCode == KeyEvent.KEYCODE_BACK) &amp;&amp; webView.canGoBack()) {\n            webView.goBack();\n            return true;\n        }\n        return super.onKeyDown(keyCode, event);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-here-s-the-full-code-for-the-mainactvity-java-file\">Here&#8217;s the full code for the <em>MainActvity.java<\/em> file:<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">import androidx.appcompat.app.AppCompatActivity;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\n\nimport android.annotation.SuppressLint;\nimport android.graphics.Bitmap;\nimport android.net.http.SslError;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.view.KeyEvent;\nimport android.view.View;\nimport android.webkit.SslErrorHandler;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\nimport android.widget.ProgressBar;\nimport android.widget.Toast;\n\npublic class MainActivity extends AppCompatActivity {\n\n    WebView webView;\n    ProgressBar progressBar;\n    SwipeRefreshLayout swipeRefreshLayout;\n\n    @SuppressLint(\"SetJavaScriptEnabled\")\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        getSupportActionBar().hide();\n\n        webView = findViewById(R.id.web);\n        progressBar = findViewById(R.id.progress);\n        swipeRefreshLayout = findViewById(R.id.swipe);\n\n\n        webView.getSettings().setJavaScriptEnabled(true);\n        webView.getSettings().setSupportZoom(false);\n        webView.getSettings().setDomStorageEnabled(true);\n        webView.setWebViewClient(new myWebViewclient());\n        webView.loadUrl(\"http:\/\/codeflarelimited.com\");\n\n        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                swipeRefreshLayout.setRefreshing(true);\n                new Handler().postDelayed(new Runnable() {\n                    @Override\n                    public void run() {\n                        swipeRefreshLayout.setRefreshing(false);\n                        webView.loadUrl(\"http:\/\/codeflarelimited.com\");\n                    }\n                },  3000);\n            }\n        });\n\n        swipeRefreshLayout.setColorSchemeColors(\n                getResources().getColor(android.R.color.holo_blue_bright),\n                getResources().getColor(android.R.color.holo_orange_dark),\n                getResources().getColor(android.R.color.holo_green_dark),\n                getResources().getColor(android.R.color.holo_red_dark)\n        );\n\n    }\n\n\n    public class myWebViewclient extends WebViewClient{\n\n        @Override\n        public boolean shouldOverrideUrlLoading(WebView view, String url) {\n            view.loadUrl(url);\n            return true;\n        }\n\n        @Override\n        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {\n            Toast.makeText(getApplicationContext(), \"No internet connection\", Toast.LENGTH_LONG).show();\n            webView.loadUrl(\"file:\/\/\/android_asset\/lost.html\");\n        }\n\n        @Override\n        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {\n            super.onReceivedSslError(view, handler, error);\n            handler.cancel();\n        }\n\n        @Override\n        public void onPageStarted(WebView view, String url, Bitmap favicon) {\n            super.onPageStarted(view, url, favicon);\n            progressBar.setVisibility(View.VISIBLE);\n        }\n\n        @Override\n        public void onPageFinished(WebView view, String url) {\n            super.onPageFinished(view, url);\n            progressBar.setVisibility(View.GONE);\n        }\n    }\n\n\n    @Override\n    public boolean onKeyDown(int keyCode, KeyEvent event) {\n\n        if ((keyCode == KeyEvent.KEYCODE_BACK) &amp;&amp; webView.canGoBack()) {\n            webView.goBack();\n            return true;\n        }\n        return super.onKeyDown(keyCode, event);\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-to-create-the-lost-html-file-for-the-webview\">To Create the <em>lost.html<\/em> file for the WebView<\/h3>\n\n\n\n<p>First, we need to create an assets folder like so:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"742\" height=\"407\" src=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/assets.png\" alt=\"\" class=\"wp-image-528\" srcset=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/assets.png 742w, https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/assets-300x165.png 300w\" sizes=\"auto, (max-width: 742px) 100vw, 742px\" \/><figcaption class=\"wp-element-caption\">Create Assets Folder in Android Studio<\/figcaption><\/figure>\n\n\n\n<p>Next, we create an image folder right inside the assets folder and just put our image there. This image will portray a network failure. I have decided to call my own gone.png. Feel free to use any image of your choice:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/Luckae\/Android-WebView-Example\/master\/app\/src\/main\/assets\/img\/gone.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Network failure<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-add-the-following-code-to-the-lost-html-file\">Add the following code to the <strong><em>lost.html<\/em><\/strong> file<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"markup\" class=\"language-markup\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"&gt;\n    &lt;title&gt;Connection Failed&lt;\/title&gt;\n    &lt;style&gt;\n  body {\n  display: inline-block;\n  background: #00AFF9 url('img\/gone.png') center\/cover no-repeat;\n  height: 100vh;\n  margin: 0;\n  color: white;\n}\n\nh1 {\n  margin: .8em 3rem;\n  font: 4em Roboto;\n}\np {\n  display: inline-block;\n  margin: .2em 3rem;\n  font: 2em Roboto;\n}\n &lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;center&gt;\n    &lt;h2 style=\"text-align:center;padding:5px;color:#d9534f\"&gt;The network failed&lt;\/h2&gt;\n    &lt;h2 style=\"text-align:center;padding:5px;color:#d9534f\"&gt;Check your network connection and swipe to refresh &lt;\/h2&gt;\n&lt;\/center&gt;\n\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre>\n\n\n\n<p><a href=\"https:\/\/codeflarelimited.com\/blog\/7-good-reasons-why-you-should-learn-software-development\/\" target=\"_blank\" rel=\"noreferrer noopener\">See 7 Reasons Why You Should Learn Software Development<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-wait-before-you-run\">Wait, before you run!<\/h3>\n\n\n\n<p>You need to add instructions for internet connection in your AndroidManifest.xml file otherwise the webView won&#8217;t show. This way we can request permission to use the internet<\/p>\n\n\n\n<p><strong>AndroidManifest.xml<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\"> &lt;uses-permission android:name=\"android.permission.INTERNET\"\/&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-congrats-we-re-good-to-go\">Congrats! We&#8217;re good to go.<\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<figure class=\"wp-block-gallery alignwide has-nested-images columns-default wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"177\" height=\"351\" data-id=\"529\" src=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Screenshot-2021-05-02-at-04.25.32.png\" alt=\"webview\" class=\"wp-image-529\" srcset=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Screenshot-2021-05-02-at-04.25.32.png 177w, https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Screenshot-2021-05-02-at-04.25.32-151x300.png 151w\" sizes=\"auto, (max-width: 177px) 100vw, 177px\" \/><\/figure>\n<\/figure>\n<\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"177\" height=\"351\" src=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Screenshot-2021-05-02-at-04.25.09.png\" alt=\"\" class=\"wp-image-530\" srcset=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Screenshot-2021-05-02-at-04.25.09.png 177w, https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Screenshot-2021-05-02-at-04.25.09-151x300.png 151w\" sizes=\"auto, (max-width: 177px) 100vw, 177px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Watch Video instead. <\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Also get Github repo link in video description<\/h3>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Android WebView + ProgressBar + Swipe to Refresh + Custom Error Page On Network Failure Tutorial\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/HI3o_Fmb2Uo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>What is a WebView? A WebView is an embeddable browser that helps a native application, such as Android,<\/p>\n","protected":false},"author":1,"featured_media":533,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[103],"tags":[],"class_list":["post-524","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure<\/title>\n<meta name=\"description\" content=\"A WebView is an embeddable browser that helps a native application, such as Android, to display web content. If you are writing an application\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure\" \/>\n<meta property=\"og:description\" content=\"A WebView is an embeddable browser that helps a native application, such as Android, to display web content. If you are writing an application\" \/>\n<meta property=\"og:url\" content=\"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/\" \/>\n<meta property=\"article:author\" content=\"https:\/\/facebook.com\/codeflretech\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-02T03:46:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-22T14:41:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Android-Webview.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"753\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"codeflare\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@codeflaretech\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/\"},\"author\":{\"name\":\"codeflare\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#\\\/schema\\\/person\\\/7e65653d49add95629f8c1053c5cd76a\"},\"headline\":\"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure\",\"datePublished\":\"2021-05-02T03:46:03+00:00\",\"dateModified\":\"2025-04-22T14:41:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/\"},\"wordCount\":705,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/Android-Webview.jpeg\",\"articleSection\":[\"Android\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/\",\"name\":\"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/Android-Webview.jpeg\",\"datePublished\":\"2021-05-02T03:46:03+00:00\",\"dateModified\":\"2025-04-22T14:41:54+00:00\",\"description\":\"A WebView is an embeddable browser that helps a native application, such as Android, to display web content. If you are writing an application\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/#primaryimage\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/Android-Webview.jpeg\",\"contentUrl\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/05\\\/Android-Webview.jpeg\",\"width\":1200,\"height\":753},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android\",\"item\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/android\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/\",\"name\":\"\",\"description\":\"Sustainable solutions\",\"publisher\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#organization\",\"name\":\"Codeflare Limited\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/codeflare.png\",\"contentUrl\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/codeflare.png\",\"width\":1040,\"height\":263,\"caption\":\"Codeflare Limited\"},\"image\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#\\\/schema\\\/person\\\/7e65653d49add95629f8c1053c5cd76a\",\"name\":\"codeflare\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59cef917c86d965eea581d2747f51bd6382003a68bfce7c8a4dfec98b4cd838d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59cef917c86d965eea581d2747f51bd6382003a68bfce7c8a4dfec98b4cd838d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59cef917c86d965eea581d2747f51bd6382003a68bfce7c8a4dfec98b4cd838d?s=96&d=mm&r=g\",\"caption\":\"codeflare\"},\"description\":\"Latest tech news and coding tips.\",\"sameAs\":[\"https:\\\/\\\/codeflarelimited.com\\\/blog\",\"https:\\\/\\\/facebook.com\\\/codeflretech\",\"https:\\\/\\\/instagram.com\\\/codeflaretech\",\"https:\\\/\\\/x.com\\\/codeflaretech\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCuBLtiYqsajHdqw0uyt7Ofw?sub_confirmation=1\"],\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/author\\\/watcher\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure","description":"A WebView is an embeddable browser that helps a native application, such as Android, to display web content. If you are writing an application","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/","og_locale":"en_US","og_type":"article","og_title":"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure","og_description":"A WebView is an embeddable browser that helps a native application, such as Android, to display web content. If you are writing an application","og_url":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/","article_author":"https:\/\/facebook.com\/codeflretech","article_published_time":"2021-05-02T03:46:03+00:00","article_modified_time":"2025-04-22T14:41:54+00:00","og_image":[{"width":1200,"height":753,"url":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Android-Webview.jpeg","type":"image\/jpeg"}],"author":"codeflare","twitter_card":"summary_large_image","twitter_creator":"@codeflaretech","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/#article","isPartOf":{"@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/"},"author":{"name":"codeflare","@id":"https:\/\/codeflarelimited.com\/blog\/#\/schema\/person\/7e65653d49add95629f8c1053c5cd76a"},"headline":"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure","datePublished":"2021-05-02T03:46:03+00:00","dateModified":"2025-04-22T14:41:54+00:00","mainEntityOfPage":{"@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/"},"wordCount":705,"commentCount":0,"publisher":{"@id":"https:\/\/codeflarelimited.com\/blog\/#organization"},"image":{"@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/#primaryimage"},"thumbnailUrl":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Android-Webview.jpeg","articleSection":["Android"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/","url":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/","name":"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure","isPartOf":{"@id":"https:\/\/codeflarelimited.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/#primaryimage"},"image":{"@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/#primaryimage"},"thumbnailUrl":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Android-Webview.jpeg","datePublished":"2021-05-02T03:46:03+00:00","dateModified":"2025-04-22T14:41:54+00:00","description":"A WebView is an embeddable browser that helps a native application, such as Android, to display web content. If you are writing an application","breadcrumb":{"@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/#primaryimage","url":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Android-Webview.jpeg","contentUrl":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Android-Webview.jpeg","width":1200,"height":753},{"@type":"BreadcrumbList","@id":"https:\/\/codeflarelimited.com\/blog\/create-a-webview-in-android-studio-progressbar-swipe-to-refresh-custom-error-page-on-network-failure\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/codeflarelimited.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android","item":"https:\/\/codeflarelimited.com\/blog\/android\/"},{"@type":"ListItem","position":3,"name":"Create a WebView in Android Studio: ProgressBar + Swipe to Refresh + Custom Error Page on Network Failure"}]},{"@type":"WebSite","@id":"https:\/\/codeflarelimited.com\/blog\/#website","url":"https:\/\/codeflarelimited.com\/blog\/","name":"","description":"Sustainable solutions","publisher":{"@id":"https:\/\/codeflarelimited.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/codeflarelimited.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/codeflarelimited.com\/blog\/#organization","name":"Codeflare Limited","url":"https:\/\/codeflarelimited.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/codeflarelimited.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2020\/11\/codeflare.png","contentUrl":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2020\/11\/codeflare.png","width":1040,"height":263,"caption":"Codeflare Limited"},"image":{"@id":"https:\/\/codeflarelimited.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/codeflarelimited.com\/blog\/#\/schema\/person\/7e65653d49add95629f8c1053c5cd76a","name":"codeflare","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/59cef917c86d965eea581d2747f51bd6382003a68bfce7c8a4dfec98b4cd838d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/59cef917c86d965eea581d2747f51bd6382003a68bfce7c8a4dfec98b4cd838d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/59cef917c86d965eea581d2747f51bd6382003a68bfce7c8a4dfec98b4cd838d?s=96&d=mm&r=g","caption":"codeflare"},"description":"Latest tech news and coding tips.","sameAs":["https:\/\/codeflarelimited.com\/blog","https:\/\/facebook.com\/codeflretech","https:\/\/instagram.com\/codeflaretech","https:\/\/x.com\/codeflaretech","https:\/\/www.youtube.com\/channel\/UCuBLtiYqsajHdqw0uyt7Ofw?sub_confirmation=1"],"url":"https:\/\/codeflarelimited.com\/blog\/author\/watcher\/"}]}},"jetpack_featured_media_url":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2021\/05\/Android-Webview.jpeg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/posts\/524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/comments?post=524"}],"version-history":[{"count":5,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/posts\/524\/revisions"}],"predecessor-version":[{"id":2903,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/posts\/524\/revisions\/2903"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/media\/533"}],"wp:attachment":[{"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/media?parent=524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/categories?post=524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/tags?post=524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}