所以我知道还有其他帖子解决了同样的问题,我想我已经跟着他们去了这封信但是唉也无济于事。我正在尝试学习如何让我的应用程序与JavaScript进行交互。我只是希望能够从我的javascript中返回一个值到我的活动 这是我的活动:
public class JSExample extends Activity {
WebView mWebView;
String mString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mWebView = (WebView)findViewById(R.id.mWebView);
mWebView.addJavascriptInterface(new ClsAccessor(), "accessor");
String html = getAssetsContent("jsinterface.html");
mWebView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);
// Log.d("YO!", mString);
}
private String getAssetsContent(String filename){
.....
}
private void closeStream(BufferedReader stream) {
.....
}
class ClsAccessor{
public void setValue(String value){
JSExample.this.mString = value;
}
}
这是我的WebView加载的html文件,其中包含我想要运行的javascript:
<!DOCTYPE html>
<html>
<head>
<script language="javascript">
accessor.setValue('Hello!');
</script>
</head>
<body>
<h1>Testing</h1>
</body>
</html>
这不起作用。当我用“Log.d(”YO!“,mString)运行代码时;”取消注释我得到一个空指针异常,这意味着javascript从未为mString赋值。我做错了什么?
答案 0 :(得分:3)
这可能不正确,我将不得不仔细检查,但可能是因为参考丢失了..
尝试将ClsAccessor
引用设为成员级别..
public class JSExample extends Activity {
...
ClsAccessor _accessor = new ClsAccessor();
...
public void onCreate(Bundle savedInstanceState) {
...
mWebView.addJavascriptInterface(_accessor, "accessor");
...
另外,如果您逐行调试,setValue()
是否会在托管代码中调用?
对于它的价值,我的代码正如我上面所描述的那样,并且托管界面的脚本工作正常,但我目前无法测试并查看是否也没有对类的引用的工作原理。
答案 1 :(得分:2)
尝试在您的网络视图上启用javascript:
mWebview.getSettings().setJavaScriptEnabled(true);
答案 2 :(得分:0)
我是通过在Webview类中使用onLoadResource来实现的。
Html页面:
<html>
<head>
function Submit(){
var username = $('#username').val();
var urlNew = 'processing.php';
urlNew = urlNew + '?' + 'username=' + username;
$('#submit').attr('href', urlNew);
return true;
}
</head>
<body>
<form>
<input id="username" name="username" type="text" />
<a href="" id="submit" onclick="return Submit();" ><img src="images/button.png" /></a>
</form>
</body>
</html>
那么在我的onLoadResource中我会听到那个网址:
public void onLoadResource(WebView view, String url)
{
if(url.contains("http://domain.com/processing.php")){
//process the url and suck out the data
}
这可能不是你需要的,但有理由我必须这样做,所以认为它可能会帮助你。还要注意我没有做表单提交,我做了<a>
提交,那是因为onLoadResource不会提取表单提交。