【月額固定報酬10万円〜】副業SES営業(リモート可) 詳細はこちら

【Android】KotlinでWebView表示を自在にカスタマイズ!WebViewClient活用術(shouldOverrideUrlLoading・onPageStarted・onReceivedError)

【Android】KotlinでWebView表示を自在にカスタマイズ!WebViewClient活用術(shouldOverrideUrlLoading・onPageStarted・onReceivedError)
すだ

みなさまこんにちは〜!
メモリアインクのすだです。

本日は、
KotlinのWebViewClient使って、
WebView表示処理にカスタマイズを加える方法を徹底解説していきます!

この記事を読んでわかること…
・WebViewClientの使い方
・shouldOverrideUrlLoadingの使い方
・onPageStarted、onPageFinishedの使い方
・onReceivedErrorの使い方

WebView表示の基本については、以下の記事で詳しく紹介しています!
ぜひあわせてご覧くださいね!

目次

環境

  • Kotlin (ver 1.9.0)
  • Android Studio (Giraffe | 2022.3.1 Patch 3)

WebViewClientとは?

WebViewClientは、Androidアプリの中でWebViewを使う際に、
WebViewの動作をカスタマイズするためのクラスです。

通常、WebViewにURLを読み込むと
クリックしたリンクやリダイレクトによって、外部のブラウザが開いてしまうことがあります。

WebViewClientを設定すると、このような動作を制御し、
WebView内でページの遷移やエラーハンドリングなどをカスタマイズできるようになります。

webView.webViewClient = object : WebViewClient() {
    ...
}

上記のようにwebView.webViewClientにカスタムのWebViewClientを設定します。
これにより、WebViewのリンク遷移やURL処理を自分でコントロールできるようになります。

それでは早速、WebViewClientの様々な使い方でカスタマイズしていきましょう!

特定のURLだけを許可する方法

「特定のURLはWebView内で開き、それ以外は外部ブラウザで開く」という挙動を実装してみます。

webView.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView?, request: android.webkit.WebResourceRequest?): Boolean {
        val url = request?.url.toString()
        return if (url.startsWith("https://www.memoriainc.com")) {
            false // WebView内で開く
        } else {
            // 他のURLは外部ブラウザで開く
            val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
            startActivity(intent)
            true
        }
    }
}

shouldOverrideUrlLoadingについて

shouldOverrideUrlLoadingは、
WebViewでリンクをクリックした際やリダイレクトが発生した際に呼び出されます。

メソッドの引数に入ってくるviewrequestは、
WebViewでページ遷移やリンククリックが発生した際に、リクエストに関する情報を提供するためのオブジェクトです。


・view: WebView?
どのWebViewからこのリクエストが発生したかを特定するために使います。
通常、WebViewの操作(例えば、新しいURLを読み込むなど)をこのviewを使って行います。
:view?.loadUrl("https://example.com")

・request: android.webkit.WebResourceRequest?
Webリクエストの詳細情報を保持するオブジェクト。
例えば、遷移先のURLやリクエストのメソッド(GETやPOST)などが含まれます。
遷移先のURL取得例: request?.url.toString()

また、
Intent.ACTION_VIEWとは Androidの標準アクションの一つで、
「指定されたURIを適切なアプリケーションで開く」という動作を指示します。

これにより、「他のURLは外部ブラウザで開く」という挙動を実現できます。

ページの読み込み状態を監視

ページが読み込まれるタイミングで処理を実行できます。
ここでは実際に、「ローディング中にスピナーを表示し、完了後に非表示にする」という処理を作成してみましょう。

webView.webViewClient = object : WebViewClient() {
    override fun onPageStarted(view: WebView?, url: String?, favicon: android.graphics.Bitmap?) {
        super.onPageStarted(view, url, favicon)
        // ローディングスピナーを表示
        progressBar.visibility = View.VISIBLE
    }

    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        // ローディングスピナーを非表示
        progressBar.visibility = View.GONE
    }
}

onPageStarted について

ページの読み込みが開始されたときに呼び出されるメソッドです。
ローディングインジケータ(ここではprogressBar)を表示して、ユーザーに「ページを読み込んでいる」というフィードバックを提供します。


onPageFinished について

ページの読み込みが完了したときに呼び出されるメソッドです。
ローディングインジケータ(progressBar)を非表示にして、ユーザーに「ページの読み込みが終わった」ことを知らせます。

ページ読み込み後に特定の処理(例: ボタンを有効化する、エラーチェックを行うなど)を追加することも可能です。

読み込みエラーの処理

ネットワーク接続がない場合や、サーバーエラーが発生した場合に、エラー画面を表示するよう実装してみます。

webView.webViewClient = object : WebViewClient() {
    override fun onReceivedError(
        view: WebView?,
        request: android.webkit.WebResourceRequest?,
        error: android.webkit.WebResourceError?
    ) {
        super.onReceivedError(view, request, error)
        println("エラーが発生: ${error?.description}")
        // エラーページを表示する処理など
    }
}

onReceivedError について

Webページの読み込み中にエラーが発生した場合に呼び出されるコールバックメソッドです。
例えば、インターネット接続がない、URLが無効、サーバーが応答しないなどの状況で実行されます。


・error: android.webkit.WebResourceError?
ここでエラーの詳細情報を提供します。

主なプロパティ:
description: エラーの簡単な説明(例: “ネットワークエラー”)
errorCode: エラーコード(例: 接続エラーやHTTPエラー)

特定のリソースをブロックする

広告や特定のスクリプトを読み込まないようにしたい場合に、リソースのURLをフィルタリングすることもできます。

webView.webViewClient = object : WebViewClient() {
    override fun shouldInterceptRequest(
        view: WebView?,
        request: android.webkit.WebResourceRequest?
    ): android.webkit.WebResourceResponse? {
        val url = request?.url.toString()
        if (url.contains("ads")) {
            // 広告リソースをブロック
            return android.webkit.WebResourceResponse(
                "text/plain", "UTF-8", null
            )
        }
        return super.shouldInterceptRequest(view, request)
    }
}

shouldInterceptRequestについて

WebViewで読み込まれるすべてのリソース(HTML、CSS、JavaScript、画像など)のリクエストをインターセプト(横取り)して、
カスタマイズしたレスポンスを返すことができるメソッドです。

このコードは、WebView内で読み込まれるリソースのURLをチェックし、
特定の条件(ここではURLに”ads”が含まれる場合)に該当するリソースをブロックしています。

return super.shouldInterceptRequest(view, request)

条件に該当しないリソース(広告でないリソース)は、上記のように通常通りWebViewに読み込ませます。

について

WebViewがリクエストしたリソース(画像やスクリプト、HTMLファイルなど)に対して、
開発者が独自に作成したレスポンスを返すためのクラスです。

ここでは、WebResourceResponse を使って、MIMEタイプ、エンコーディング、データストリームを指定。null を指定することで、実質的にリソースを「無効化」します。

結果的に広告が表示されない
広告スクリプトや画像がブロックされるため、ページに広告が表示されなくなります。

キャッシュの無効化

WebViewでWebページを表示する際に、キャッシュを使用しないように設定することもできます。
キャッシュを無効にすることで、WebViewは常に最新のデータを取得し、サーバーから新しいリソースを読み込みます。

webView.webViewClient = object : WebViewClient() {
    override fun onPageStarted(view: WebView?, url: String?, favicon: android.graphics.Bitmap?) {
        super.onPageStarted(view, url, favicon)
        webView.settings.cacheMode = android.webkit.WebSettings.LOAD_NO_CACHE
    }
}

settings.cacheModeについて

WebViewがWebページのリソース(HTML、画像、CSSなど)をどのように扱うかを指定する設定です。
キャッシュを有効または無効にすることで、リソースの読み込み方法を制御します。

LOAD_NO_CACHEはキャッシュを使用しないモードです。
ページを表示するたびに、すべてのリソースをサーバーから新たに取得します。
キャッシュを一切参照しないため、最新のWebページの内容を表示します。

まとめ

おつかれさまでした!いかがでしたでしょうか!

ただWebViewを表示するだけでなく、WebViewを表示する箇所で様々にカスタマイズしてあげることによって
ユーザー体験の向上につながることがあります!

ぜひぜひマスターしてくださいね!

すだ

技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

それではまた次の記事でお会いしましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次