Saya mencoba memanggil beberapa javascript
fungsi yang duduk di html
halaman yang berjalan di dalam sebuah android webview
. Cukup sederhana apa yang coba dilakukan oleh kode di bawah ini - dari aplikasi android, panggil javascript
fungsi dengan pesan tes, yang intinya memanggil fungsi java kembali di aplikasi android yang menampilkan pesan pengujian melalui roti panggang.
The javascript
Fungsi terlihat seperti:
function testEcho(message){
window.JSInterface.doEchoTest(message);
}
Dari WebView, saya telah mencoba memanggil javascript
cara-cara berikut tanpa hasil:
myWebView.loadUrl("javascript:testEcho(Hello World!)");
mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()");
Saya mengaktifkan javascript
diWebView
myWebView.getSettings().setJavaScriptEnabled(true);
// register class containing methods to be exposed to JavaScript
myWebView.addJavascriptInterface(myJSInterface, "JSInterface");
Dan inilah Java
Kelas
public class JSInterface{
private WebView mAppView;
public JSInterface (WebView appView) {
this.mAppView = appView;
}
public void doEchoTest(String echo){
Toast toast = Toast.makeText(mAppView.getContext(), echo, Toast.LENGTH_SHORT);
toast.show();
}
}
Saya telah menghabiskan banyak waktu untuk melihat-lihat kesalahan saya. Semua contoh yang saya temukan menggunakan pendekatan ini. Adakah yang melihat sesuatu yang salah di sini?
Sunting: Ada beberapa javascript
file eksternal lain yang direferensikan & digunakan dalam html
, mungkinkah itu masalahnya?
sumber
@JavascriptInterface
dekorator pada metode Java yang ingin Anda buat tersedia untuk WebView melalui Antarmuka JavaScript.myWebView.loadUrl("javascript:testEcho('Hello World!')");
saya mengerti bahwa Anda telah melampirkan file html ke tampilan web itu. Bisakah Anda memberi tahu saya bagaimana Anda melakukannya?Jawaban:
Saya menemukan apa masalahnya: tidak ada tanda kutip di parameter testEcho (). Beginilah cara saya mendapat panggilan untuk bekerja:
sumber
Dari kitkat dan seterusnya, gunakan metode evaluasiJavascript, bukan loadUrl untuk memanggil fungsi javascript seperti di bawah ini
sumber
loadUrl
juga menyebabkan keyboard perangkat lunak muncul ketika saya mencoba mengisi nilai di bidang input.sumber
Saya membuat pembungkus yang bagus untuk memanggil metode JavaScript; itu juga menunjukkan kesalahan JavaScript di log:
Anda perlu menambahkan ini juga:
Dan tambahkan antarmuka ini ke tampilan web Anda:
sumber
final Object a = new Object(); callJavaScript(mBrowser, "alert", 1, true, "abc", a);
akan menyerahSyntaxError
denganUnexpected token
yang tidak mengejutkan ketika Anda akan melihat js dihasilkan hubungi:javascript:try{alert(,,'abc',,)}catch(error){console.error(error.message);}
callJavaScript(mBrowser, "alert", "abc", "def");
menghasilkan kesalahan karena selalu ada koma nakal di akhir. -1 dari saya.callJavascript(mBrowser, "can't do it");
Ya, Anda memiliki kesalahan sintaksis. Jika Anda ingin mendapatkan kesalahan Javascript dan pernyataan pencetakan di logcat Anda, Anda harus menerapkan
onConsoleMessage(ConsoleMessage cm)
metode ini di WebChromeClient Anda. Ini memberikan jejak tumpukan lengkap seperti konsol Web (elemen Inspect). Inilah metodenya.Setelah implementasi, Anda akan mendapatkan kesalahan Javascript dan pernyataan cetak (
console.log
) di logcat Anda.sumber
Modifikasi jawaban @Ilya_Gazman
akan dengan benar membuat panggilan JS misalnya
Perhatikan bahwa objek tidak akan diteruskan dengan benar - tetapi Anda dapat membuat cerita bersambung sebelum diteruskan sebagai argumen.
Saya juga telah mengubah arah kesalahan, saya mengalihkannya ke log konsol yang dapat didengarkan oleh:
dan klien
sumber
callJavascript(mBrowser, "can't do it");
:?activity_main.xml
MainActivity.java
file aset
sumber