在 WebView 載入的網頁中(如抽獎頁),點擊按鈕觸發 JS 邏輯後,需在原生 App 層彈出 Toast 提示(如「恭喜中獎:蘋果」),不跳轉頁面。
window.location.href = 'myapp://toast?msg=恭喜中獎:蘋果';WebViewClient 中重寫 shouldOverrideUrlLoading:webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("myapp://toast")) {
// 解析參數
Uri uri = Uri.parse(url);
String msg = uri.getQueryParameter("msg");
// 顯示 Toast
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
return true; // 表示已處理,阻止 WebView 載入該 URL
}
return false; // 其他 URL 正常載入
}
});
若網頁可修改,更推薦使用 @JavascriptInterface 直接暴露原生方法:
class JsBridge {
@JavascriptInterface
public void showToast(String msg) {
runOnUiThread(() -> Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show());
}
}
webView.addJavascriptInterface(new JsBridge(), "Android");
// 網頁調用:Android.showToast("恭喜中獎:蘋果");
addJavascriptInterface 在 Android 4.2 (API 17) 以下有安全漏洞,必須加 @JavascriptInterface 註解並針對性導出方法。針對無法修改網頁或需兼容舊版本場景,shouldOverrideUrlLoading 攔截自定義協議是最穩健方案;可修改網頁且最低版本 4.2+ 時,addJavascriptInterface 代碼更簡潔直觀。