Android WebView JavaScript alert
Android WebView
By default, Android doesn’t handle JavaScript alert();
The reason is that Android handles UI by itself. (To change UI, we need to use main thread of Android).
To handle this problem, we need to implement client.
It means that it happens this situation, we ask WebView to handle this.
Example
UI
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="jp.co.rakuten.toolbar.webviewtest.MainActivity"
tools:showIn="@layout/activity_main">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
</RelativeLayout>
HTML
<html>
<head>
<title>JavaScript</title>
<script>
function test() {
alert("OK");
}
</script>
</head>
<body>
<button onclick="test();">Click me!</button>
</body>
</html>
Java
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
// Load local webview
webView.loadUrl("file:///android_asset/index.html");
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
});
}
}
To add setWebChromeClient and implement onJSAlert
Of course, we can change UI as Alert dialog. If you use super.onJsAlert, open Android dialog by default.
