Gunakan WebView
untuk mengirimkan aplikasi web
atau halaman web sebagai bagian dari aplikasi klien. Class WebView
adalah
ekstensi class View
Android yang memungkinkan
Anda menampilkan halaman web sebagai bagian dari tata letak aktivitas Anda. Class ini tidak menyertakan fitur browser web yang dikembangkan sepenuhnya, seperti kontrol navigasi atau kolom URL. Semua yang dilakukan WebView
secara default adalah menampilkan halaman web.
WebView
dapat membantu Anda memberikan informasi di aplikasi yang mungkin perlu diperbarui, seperti perjanjian pengguna akhir atau panduan pengguna. Dalam aplikasi Android,
Anda dapat membuat Activity
yang berisi
WebView
, lalu menggunakannya untuk menampilkan dokumen Anda yang dihosting secara online.
WebView
juga dapat membantu saat aplikasi Anda memberikan data kepada pengguna yang memerlukan koneksi internet untuk mengambil data, seperti email. Dalam kasus ini, Anda mungkin
menyadari bahwa lebih mudah untuk membuat WebView
di aplikasi Android Anda yang menampilkan halaman web dengan semua data pengguna, daripada membuat permintaan jaringan, lalu mengurai data, dan merendernya dalam tata letak Android. Sebagai gantinya, Anda dapat mendesain halaman web yang disesuaikan untuk perangkat berteknologi Android, lalu menerapkan
WebView
di aplikasi Android Anda yang memuat halaman web.
Dokumen ini menjelaskan cara memulai WebView
, cara mengikat
JavaScript dari halaman web Anda ke kode sisi klien di aplikasi Android Anda, cara
menangani navigasi halaman, dan cara mengelola jendela saat menggunakan WebView
.
Bekerja dengan WebView di Android versi sebelumnya
Untuk menggunakan kemampuan WebView
yang lebih baru secara aman di perangkat tempat aplikasi Anda berjalan, tambahkan library AndroidX
Webkit. Ini adalah library
statis yang dapat Anda tambahkan ke aplikasi untuk menggunakan API android.webkit
yang tidak
tersedia untuk versi platform sebelumnya.
Tambahkan ke file build.gradle
Anda sebagai berikut:
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.8.0") }
Groovy
dependencies { implementation ("androidx.webkit:webkit:1.8.0") }
Jelajahi contoh WebView
di GitHub untuk mengetahui detail selengkapnya.
Menambahkan WebView ke aplikasi Anda
Untuk menambahkan WebView
ke aplikasi, Anda dapat menyertakan elemen <WebView>
di tata letak aktivitas atau menetapkan seluruh jendela Activity
sebagai WebView
di onCreate()
.
Menambahkan WebView di tata letak aktivitas
Untuk menambahkan WebView
ke aplikasi Anda di tata letak, tambahkan kode berikut ke
file XML tata letak aktivitas Anda:
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" />
Untuk memuat halaman web di WebView
, gunakan
loadUrl()
, seperti
yang ditunjukkan dalam contoh berikut:
Kotlin
val myWebView: WebView = findViewById(R.id.webview) myWebView.loadUrl("http://www.example.com")
Java
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadUrl("http://www.example.com");
Menambahkan WebView di onCreate()
Untuk menambahkan WebView
ke aplikasi Anda di metode onCreate()
aktivitas, gunakan
logika yang mirip dengan yang berikut ini:
Kotlin
val myWebView = WebView(activityContext) setContentView(myWebView)
Java
WebView myWebView = new WebView(activityContext); setContentView(myWebView);
Kemudian muat halaman:
Kotlin
myWebView.loadUrl("http://www.example.com")
Java
myWebView.loadUrl("https://www.example.com");
Atau muat URL dari string HTML:
Kotlin
// Create an unencoded HTML string, then convert the unencoded HTML string into // bytes. Encode it with base64 and load the data. val unencodedHtml = "<html><body>'%23' is the percent code for ‘#‘ </body></html>"; val encodedHtml = Base64.encodeToString(unencodedHtml.toByteArray(), Base64.NO_PADDING) myWebView.loadData(encodedHtml, "text/html", "base64")
Java
// Create an unencoded HTML string, then convert the unencoded HTML string into // bytes. Encode it with base64 and load the data. String unencodedHtml = "<html><body>'%23' is the percent code for ‘#‘ </body></html>"; String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING); myWebView.loadData(encodedHtml, "text/html", "base64");
Aplikasi Anda harus memiliki akses ke internet. Untuk mendapatkan akses internet, minta izin
INTERNET
dalam file
manifes Anda, seperti yang ditunjukkan dalam contoh berikut:
<manifest ... > <uses-permission android:name="android.permission.INTERNET" /> ... </manifest>
Anda dapat menyesuaikan WebView
dengan melakukan salah satu hal berikut:
- Mengaktifkan dukungan layar penuh menggunakan
WebChromeClient
. Class ini juga dipanggil saatWebView
memerlukan izin untuk mengubah UI aplikasi host, seperti membuat atau menutup jendela atau mengirim dialog JavaScript kepada pengguna. Untuk mempelajari lebih lanjut proses debug dalam konteks ini, baca Men-debug aplikasi web. - Menangani peristiwa yang memengaruhi perenderan konten, seperti error pada pengiriman formulir atau navigasi menggunakan
WebViewClient
. Anda juga dapat menggunakan subclass ini untuk mengintersep pemuatan URL. - Mengaktifkan JavaScript dengan mengubah
WebSettings
. - Menggunakan JavaScript untuk mengakses objek framework Android yang telah Anda masukkan ke dalam
WebView
.
Menggunakan JavaScript di WebView
Jika halaman web yang ingin dimuat di WebView
menggunakan JavaScript, Anda harus
mengaktifkan JavaScript untuk WebView
Anda. Setelah mengaktifkan JavaScript, Anda dapat
membuat antarmuka di antara kode aplikasi dan kode JavaScript.
Aktifkan JavaScript
JavaScript dinonaktifkan di WebView
secara default. Anda dapat mengaktifkannya melalui
WebSettings
yang terpasang ke WebView
Anda. Ambil WebSettings
dengan
getSettings()
, lalu aktifkan
JavaScript dengan
setJavaScriptEnabled()
.
Lihat contoh berikut:
Kotlin
val myWebView: WebView = findViewById(R.id.webview) myWebView.settings.javaScriptEnabled = true
Java
WebView myWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true);
WebSettings
memberikan akses ke berbagai setelan lain yang mungkin berguna bagi Anda. Misalnya, jika Anda mengembangkan aplikasi web yang dirancang khusus untuk WebView
di aplikasi Android, Anda dapat menentukan string agen pengguna kustom dengan setUserAgentString()
, lalu kueri agen pengguna kustom di halaman web untuk memverifikasi bahwa klien yang meminta halaman web adalah aplikasi Android Anda.
Mengikat kode JavaScript ke kode Android
Saat mengembangkan aplikasi web yang dirancang khusus untuk WebView
di aplikasi Android, Anda dapat membuat antarmuka di antara kode JavaScript dan kode Android sisi klien. Misalnya, kode JavaScript Anda dapat memanggil metode di kode Android untuk menampilkan Dialog
,
alih-alih menggunakan fungsi alert()
JavaScript.
Untuk mengikat antarmuka baru di antara kode JavaScript dan Android, panggil
addJavascriptInterface()
,
dengan meneruskan instance class untuk mengikat JavaScript dan nama antarmuka
yang dapat dipanggil oleh JavaScript untuk mengakses class tersebut.
Misalnya, Anda dapat menyertakan class berikut di aplikasi Android:
Kotlin
/** Instantiate the interface and set the context. */ class WebAppInterface(private val mContext: Context) { /** Show a toast from the web page. */ @JavascriptInterface fun showToast(toast: String) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show() } }
Java
public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context. */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page. */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }
Dalam contoh ini, class WebAppInterface
memungkinkan halaman web membuat pesan
Toast
, menggunakan metode showToast()
.
Anda dapat mengikat class ini ke JavaScript yang berjalan di WebView
dengan
addJavascriptInterface()
, seperti yang ditunjukkan dalam contoh berikut:
Kotlin
val webView: WebView = findViewById(R.id.webview) webView.addJavascriptInterface(WebAppInterface(this), "Android")
Java
WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android");
Tindakan ini akan membuat antarmuka yang disebut Android
untuk JavaScript yang berjalan di
WebView
. Pada tahap ini, aplikasi web Anda memiliki akses ke class
WebAppInterface
. Misalnya, berikut beberapa HTML dan JavaScript yang
membuat pesan toast menggunakan antarmuka baru saat pengguna mengetuk tombol:
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript"> function showAndroidToast(toast) { Android.showToast(toast); } </script>
Anda tidak perlu melakukan inisialisasi antarmuka Android
dari JavaScript. WebView
otomatis membuatnya tersedia untuk halaman web Anda. Jadi, saat pengguna
mengetuk tombol, fungsi showAndroidToast()
akan menggunakan antarmuka Android
untuk memanggil metode WebAppInterface.showToast()
.
Menangani navigasi halaman
Saat pengguna mengetuk link dari halaman web di WebView
, secara default, Android
meluncurkan aplikasi yang menangani URL. Biasanya, browser web default akan membuka dan
memuat URL tujuan. Namun, Anda dapat mengganti perilaku ini untuk
WebView
sehingga link akan terbuka dalam WebView
. Anda kemudian dapat mengizinkan pengguna
menavigasi mundur dan maju pada histori halaman web mereka yang dikelola
oleh WebView
Anda.
Untuk membuka link yang diketuk oleh pengguna, berikan WebViewClient
untuk WebView
Anda menggunakan setWebViewClient()
.
Semua link yang diketuk pengguna akan dimuat di WebView
Anda. Jika Anda menginginkan kontrol lebih untuk tempat link yang diklik dimuat, buat WebViewClient
Anda sendiri yang menggantikan metode
shouldOverrideUrlLoading()
. Contoh berikut mengasumsikan bahwa MyWebViewClient
adalah class dalam
dari Activity
.
Kotlin
private class MyWebViewClient : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { if (Uri.parse(url).host == "www.example.com") { // This is your website, so don't override. Let your WebView load // the page. return false } // Otherwise, the link isn't for a page on your site, so launch another // Activity that handles URLs. Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { startActivity(this) } return true } }
Java
private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { if ("www.example.com".equals(request.getUrl().getHost())) { // This is your website, so don't override. Let your WebView load the // page. return false; } // Otherwise, the link isn't for a page on your site, so launch another // Activity that handles URLs. Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl()); startActivity(intent); return true; } }
Kemudian, buat instance WebViewClient
baru ini untuk WebView
:
Kotlin
val myWebView: WebView = findViewById(R.id.webview) myWebView.webViewClient = MyWebViewClient()
Java
WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.setWebViewClient(new MyWebViewClient());
Sekarang, saat pengguna mengetuk link, sistem akan memanggil
metode shouldOverrideUrlLoading()
, yang memeriksa apakah host URL cocok dengan
domain tertentu, seperti yang ditentukan dalam contoh sebelumnya. Jika cocok, maka
metode akan menampilkan false dan tidak mengganti pemuatan URL. Hal ini memungkinkan
WebView
memuat URL seperti biasa. Jika host URL tidak cocok, maka
Intent
akan dibuat untuk meluncurkan
Activity
default untuk menangani URL, yang dicocokkan untuk browser web default pengguna.
Menangani URL kustom
WebView
menerapkan batasan saat meminta resource dan menyelesaikan link yang menggunakan skema URL kustom. Misalnya, jika Anda menerapkan callback seperti
shouldOverrideUrlLoading()
atau
shouldInterceptRequest()
,
WebView
akan memanggilnya hanya untuk URL yang valid.
Misalnya, WebView
mungkin tidak memanggil metode shouldOverrideUrlLoading()
Anda untuk link seperti ini:
<a href="showProfile">Show Profile</a>
URL yang tidak valid, seperti yang ditunjukkan dalam contoh sebelumnya, ditangani secara tidak konsisten di WebView
, jadi sebaiknya gunakan URL yang terbentuk dengan baik.
Anda dapat menggunakan skema kustom atau URL HTTPS untuk domain yang dikontrol oleh organisasi Anda.
Daripada menggunakan string sederhana di link, seperti pada contoh sebelumnya, Anda dapat menggunakan skema kustom seperti berikut:
<a href="example-app:showProfile">Show Profile</a>
Anda kemudian dapat menangani URL ini di metode shouldOverrideUrlLoading()
seperti ini:
Kotlin
// The URL scheme must be non-hierarchical, meaning no trailing slashes. const val APP_SCHEME = "example-app:" override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { return if (url?.startsWith(APP_SCHEME) == true) { urlData = URLDecoder.decode(url.substring(APP_SCHEME.length), "UTF-8") respondToData(urlData) true } else { false } }
Java
// The URL scheme must be non-hierarchical, meaning no trailing slashes. private static final String APP_SCHEME = "example-app:"; @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith(APP_SCHEME)) { urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8"); respondToData(urlData); return true; } return false; }
shouldOverrideUrlLoading()
API terutama ditujukan untuk meluncurkan intent
untuk URL tertentu. Saat mengimplementasikannya, pastikan untuk menampilkan false
untuk URL
yang ditangani WebView
. Namun, Anda tidak hanya dapat meluncurkan intent. Anda dapat mengganti peluncuran intent dengan perilaku kustom apa pun dalam contoh kode sebelumnya.
Menavigasi histori halaman web
Saat mengganti pemuatan URL, WebView
Anda otomatis mengakumulasi histori halaman web yang dikunjungi. Anda dapat menavigasi mundur dan maju di
histori dengan goBack()
dan
goForward()
.
Misalnya, berikut cara Activity
Anda dapat menggunakan tombol Kembali
perangkat untuk menavigasi mundur:
Kotlin
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { // Check whether the key event is the Back button and if there's history. if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) { myWebView.goBack() return true } // If it isn't the Back button or there isn't web page history, bubble up to // the default system behavior. Probably exit the activity. return super.onKeyDown(keyCode, event) }
Java
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Check whether the key event is the Back button and if there's history. if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { myWebView.goBack(); return true; } // If it isn't the Back button or there's no web page history, bubble up to // the default system behavior. Probably exit the activity. return super.onKeyDown(keyCode, event); }
Jika aplikasi Anda menggunakan AndroidX AppCompat
1.6.0+, Anda dapat menyederhanakan cuplikan
sebelumnya lebih lanjut:
Kotlin
onBackPressedDispatcher.addCallback { // Check whether there's history. if (myWebView.canGoBack()) { myWebView.goBack() } }
Java
onBackPressedDispatcher.addCallback { // Check whether there's history. if (myWebView.canGoBack()) { myWebView.goBack(); } }
Metode canGoBack()
menampilkan nilai benar jika ada histori halaman web untuk dikunjungi pengguna. Demikian juga, Anda
dapat menggunakan canGoForward()
untuk
memeriksa apakah ada histori penerusan. Jika Anda tidak melakukan pemeriksaan ini, maka
setelah pengguna mencapai akhir histori, goBack()
dan goForward()
tidak akan melakukan
apa pun.
Menangani perubahan konfigurasi perangkat
Selama waktu proses, perubahan status aktivitas terjadi saat konfigurasi perangkat berubah, misalnya saat pengguna memutar perangkat atau menutup editor metode input (IME). Perubahan ini menyebabkan aktivitas objek WebView
diakhiri dan aktivitas
baru dibuat, yang juga membuat objek WebView
baru yang memuat
URL objek yang diakhiri. Untuk mengubah perilaku default aktivitas, Anda dapat mengubah cara penanganan perubahan orientation
di manifes Anda. Untuk mempelajari lebih lanjut cara menangani perubahan konfigurasi selama waktu proses, baca Menangani perubahan konfigurasi.
Mengelola jendela
Secara default, permintaan untuk membuka jendela baru akan diabaikan. Hal ini berlaku jika jendela tersebut
dibuka oleh JavaScript atau atribut target di suatu link. Anda dapat menyesuaikan
WebChromeClient
untuk memberikan perilaku Anda sendiri saat membuka beberapa
jendela.
Agar aplikasi Anda lebih aman, sebaiknya cegah pop-up dan jendela baru agar tidak terbuka. Cara paling aman untuk mengimplementasikan perilaku ini adalah dengan meneruskan "true"
ke dalam
setSupportMultipleWindows()
tetapi tidak mengganti
onCreateWindow()
metode, yang merupakan metode tempat setSupportMultipleWindows()
bergantung. Logika ini mencegah semua halaman yang menggunakan target="_blank"
di linknya untuk dimuat.