Saya punya WebView
yang memuat halaman dari Internet. Saya ingin menunjukkan ProgressBar
sampai pemuatan selesai.
Bagaimana cara saya mendengarkan penyelesaian pemuatan halaman a WebView
?
android
android-webview
Janusz
sumber
sumber
Jawaban:
Perluas WebViewClient dan panggil onPageFinished () sebagai berikut:
sumber
@ apakah ini tidak 100% akurat. Jika Anda memiliki beberapa iframe di halaman, Anda akan memiliki beberapa onPageFinished (dan onPageStarted). Dan jika Anda memiliki beberapa pengalihan, mungkin juga gagal. Pendekatan ini memecahkan (hampir) semua masalah:
MEMPERBARUI:
Menurut dokumentasi: onPageStarted TIDAK akan dipanggil ketika konten bingkai yang disematkan berubah, yaitu mengklik tautan yang targetnya adalah iframe.
Saya menemukan kasus khusus seperti itu di Twitter di mana hanya halamanFinished dipanggil dan mengacaukan logikanya sedikit. Untuk mengatasi itu saya menambahkan tugas yang dijadwalkan untuk menghapus pemuatan setelah X detik. Ini tidak diperlukan dalam semua kasus lainnya.
PEMBARUAN 2 :
Sekarang dengan implementasi Android WebView saat ini:
sumber
Saya cukup menyukai solusi @NeTeInStEiN (dan @polen) tetapi akan menerapkannya dengan counter, bukan boolean atau pengamat negara (hanya rasa lain tapi saya pikir mungkin akan berbagi). Memang ada nuansa JS tentang hal itu tetapi saya merasa logikanya sedikit lebih mudah dimengerti.
sumber
running = 1;
dionPageStarted()
?Saya menemukan satu solusi elegan juga, belum mengujinya dengan ketat:
sumber
Saya telah menyederhanakan kode NeTeInStEiN menjadi seperti ini:
Sangat mudah dimengerti, OnPageFinished jika panggilan balik sebelumnya pada onPageStarted, sehingga halaman benar-benar dimuat.
sumber
Jika Anda ingin menampilkan bilah kemajuan, Anda perlu mendengarkan acara perubahan kemajuan, tidak hanya untuk penyelesaian halaman:
BTW jika Anda ingin menampilkan ProgressBar tak tentu hanya menimpa metode onPageFinished cukup
sumber
Gunakan setWebViewClient () dan ganti onPageFinished ()
sumber
Anda dapat melacak Progress Staus dengan metode getProgress di kelas tampilan web .
Inisialisasi status kemajuan
maka AsyncTask untuk memuat seperti ini:
sumber
terima kasih atas jawabannya. Itu membantu saya, tetapi saya harus memperbaikinya sedikit untuk kebutuhan saya. Saya punya beberapa pagestart dan selesai jadi saya menambahkan timer yang memeriksa apakah atfer pagefinish memulai pagestart baru. Oke, penjelasan yang buruk. Lihat kodenya :)
sumber
Berikut adalah metode baru untuk dideteksi ketika URL telah dimuat dengan memanfaatkan kemampuan Android untuk kait JavaScript . Dengan menggunakan pola ini, kami mengeksploitasi pengetahuan JavaScript tentang status dokumen untuk menghasilkan pemanggilan metode asli dalam runtime Android. Panggilan yang dapat diakses JavaScript ini dapat dibuat menggunakan
@JavaScriptInterface
anotasi.Implementasi ini mengharuskan kita sebut
setJavaScriptEnabled(true)
padaWebView
pengaturan 's, sehingga mungkin tidak cocok tergantung pada kebutuhan aplikasi Anda, misalnya masalah keamanan.src / io / github / cawfree / webviewcallback / MainActivity.java (Jelly Bean, API Level 16)
res / layout / activity_main.xml
Pada dasarnya, kami menambahkan fungsi JavaScript tambahan yang digunakan untuk menguji keadaan dokumen. Jika dimuat, kami meluncurkan
onPageLoaded()
acara khusus di AndroidMainActivity
; jika tidak, kami mendaftarkan pendengar acara yang memperbarui Android setelah halaman siap, menggunakanwindow.addEventListener('onload', ...);
.Karena kami akan menambahkan skrip ini setelah panggilan
this.getWebView().loadURL("")
dibuat, besar kemungkinan kami tidak perlu 'mendengarkan' acara sama sekali, karena kami hanya mendapatkan kesempatan untuk menambahkan kait JavaScript dengan melakukan panggilan berturut-turut keloadURL
, setelah halaman telah dimuat.sumber
Hanya untuk memperlihatkan progress bar, metode "onPageStarted" dan "onPageFinished" sudah cukup; tetapi jika Anda ingin memiliki bendera "is_loading" (bersama dengan pengalihan halaman, ...), metode ini dapat dijalankan dengan non-sequencing, seperti "onPageStarted> onPageStarted> onPageFinished> onPageFinished" antrian.
Tetapi dengan tes singkat saya (tes sendiri.), Antrian nilai metode "onProgressChanged" adalah "0-100> 0-100> 0-100> ..."
Juga setel "
is_loading = false
" pada aktivitas tutup, jika itu adalah variabel statis karena aktivitas dapat diselesaikan sebelum halaman selesai.sumber
Memuat url dengan
SwipeRefreshLayout
danProgressBar
:UrlPageActivity.java:
activity_url_page.xml:
sumber
Berikut adalah metode yang memungkinkan Anda untuk mendaftar
Runnable
untuk dieksekusi setelah alamat web tertentu selesai dimuat. Kita kaitkan masing-masingRunnable
dengan URL yang sesuaiString
dalamMap
, dan kami menggunakanWebView
'sgetOriginalUrl()
metode untuk memilih callback yang sesuai.sumber
Perender tidak akan menyelesaikan rendering ketika metode OnPageFinshed dipanggil atau progresnya mencapai 100% sehingga kedua metode tidak menjamin Anda bahwa tampilan telah sepenuhnya di-render.
Tapi Anda bisa mencari tahu dari metode OnLoadResource apa yang telah dirender dan apa yang masih render. Dan metode ini dipanggil beberapa kali.
sumber
Gunakan ini untuk membantu.`var currentUrl = "google.com" var partOfUrl = currentUrl.substring (0, currentUrl.length-2)
webView.setWebViewClient (objek: WebViewClient () {
// Anda juga harus mengganti metode override lain untuk kesalahan seperti onReceiveError untuk melihat bagaimana semua metode ini disebut satu demi satu dan bagaimana mereka berperilaku saat debugging dengan break point. } `
sumber
untuk pengguna Kotlin:
ada banyak metode yang bisa Anda timpa
sumber