Reputation: 7900
I want to run JavaScript function on my android app,this is how i create the webview:
m_FullJSWebView = new WebView(m_VideoView.getContext());
m_FullJSWebView.loadData(htmltmp, "text/html", "UTF-8");
m_FullJSWebView.getSettings().setJavaScriptEnabled(true);
m_FullJSWebView.addJavascriptInterface(new JavaScriptInterface(m_VideoView.getContext()), "MyAndroid");
m_FullJSWebView.loadUrl("javascript:getValue()");
This is the html:
<html>
<head>
<script type="text/javascript">
function getValue(){
//return value to Android
var val= 50;
MyAndroid.receiveValueFromJs(val);
}
</script>
<title></title>
</head>
<body >
<form name="ipForm" id="ipForm">
UserName : <input type="text" name="userName">
<button type="button" onclick="getValue();">Submit</button>
</form>
</body>
</html>
And this is the JavascriptInterface
:
public class JavaScriptInterface {
Context mContext;
JavaScriptInterface(Context c) {
mContext = c;
}
//add other interface methods to be called from JavaScript
public void receiveValueFromJs(String str) {
//do something useful with str
Toast.makeText(mContext, "Received Value from JS: " + str,Toast.LENGTH_SHORT).show();
}
}
After i run it on my device the receiveValueFromJs
function won't called.Any idea what is the problem?
Upvotes: 3
Views: 204
Reputation: 39406
From the doc:
Note that injected objects will not appear in JavaScript until the page is next (re)loaded.
Which means that you must change your methods order like that:
m_FullJSWebView = new WebView(m_VideoView.getContext());
m_FullJSWebView.addJavascriptInterface(new JavaScriptInterface(m_VideoView.getContext()), "MyAndroid");
m_FullJSWebView.loadData(htmltmp, "text/html", "UTF-8");
m_FullJSWebView.getSettings().setJavaScriptEnabled(true);
m_FullJSWebView.loadUrl("javascript:getValue()");
the name
parameter in the addJavascriptInterface
is name of the java object in the javascript. it is the object on which to call the methods from the javascript.
Therefore, your call should be:
m_FullJSWebView.loadUrl("javascript:MyAndroid.getValue()");
Upvotes: 1