Ivan Bahri
Ivan Bahri

Reputation: 89

How to Replace Webpage Not Available Page To Custom Page? (WEBVIEW)

I want to change page from Webpage not Available or ERR_NAME_NOT_RESOLVED

to My Page "No Internet Connection"?

and with a refresh button to back online if online or connected internet again, and if didn't connect just stay in Page No Internet Connection.

Look like a page HTML not default notif page android.

I'm using a Android Studio with Kotlin

This is MyActivity

class MainActivity : AppCompatActivity() {
    internal var webView: WebView? = null
    private var mCM: String? = null
    private var mUM: ValueCallback<Uri>? = null
    private var mUMA: ValueCallback<Array<Uri?>>? = null

    //select whether you want to upload multiple files (set 'true' for yes)
    private val multiple_files = false

    @SuppressLint("SetJavaScriptEnabled", "WrongViewCast")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        webView = findViewById(R.id.ifView) as WebView
        assert(webView != null)
        val webSettings = webView!!.settings
        webSettings.javaScriptEnabled = true
        webSettings.allowFileAccess = true

        if (Build.VERSION.SDK_INT >= 21) {
            webSettings.mixedContentMode = 0
            webView!!.setLayerType(View.LAYER_TYPE_HARDWARE, null)
        }
        else {
            webView!!.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
        }
        webView!!.webViewClient = Callback()
        webView!!.loadUrl("http://xxx.xxx.xxx") //add your test web/page address here
        webView!!.setWebChromeClient(object : WebChromeClient()
}

This is my code Callback

inner class Callback : WebViewClient() {
        override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) {
            Toast.makeText(applicationContext, "Failed loading app!", Toast.LENGTH_SHORT).show()
            }
    }

For sure, my apps want load offline page where webview offline to notif the apps didn't connect internet, and connect again to the internet showing online page when webview online

Upvotes: 2

Views: 3617

Answers (1)

Bali
Bali

Reputation: 759

Replace default WebChromeClient with your custom CustomWebviewClient as below

webView!!.setWebViewClient(object : CustomWebviewClient()

then create this custom WebViewClient

    inner class CustomWebviewClient : WebViewClient() {

    override fun onPageStarted(view: WebView, url: String, favicon: Bitmap) {
        super.onPageStarted(view, url, favicon)
    }

    override fun onPageFinished(view: WebView, url: String) {
        super.onPageFinished(view, url)
    }

    override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) {
        super.onReceivedError(view, request, error)

        if (noInternetConnection()) {
            loadNoInternetErrorView()
        } else {
            loadErrorMessageView()
        }
    }
}

whenever your WebView fails to load page it calls onReceivedError callback there you can show error layout. For error view you can create error layout within your layout with initial visiblity View.GONE and make it visible when error occurrs.

Changes to your XML file

<WebView 
   android:id="@+id/webView"
   android:layout_width="match_parent"
   android:layout_height="match_parent"/> 

<LinearLayout
   android:id="@+id/error_screen"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">

  <Textview 
    android:id="@+id/error_msg" />
  ................
  <ImageView
    android:id=:"@+id/error_icon/>
  //error view


</LinearLayout>

In loadErrorMessageView you can do this

loadErrorMessageView() {
 webview.setVisibility(View.GONE);
 error_screen.setVisibility(View.VISIBLE);
 error_msg.setText("Some error Occurred");
}

Similarly you can do for NoInternet case maybe you can show "No internet message" than "Some error occurred" I hope this clears your doubt

Upvotes: 1

Related Questions