我正在尝试使用带有输入框的webview,获取字符串,并将其传递给第二个活动。出于某种原因,按钮没有做任何事情,我得到错误:
未捕获TypeError:对象[object Object]在file:///android_asset/www/index.js上没有方法'changeActivity':3
所以我的HTML说:
<input id="name" value="" />
<button onclick="checkMovie()"> Check it! </button>
我的JS说:
function checkMovie() {
var movieName = document.getElementById('name').value;
webapi.changeActivity(movieName);}
我的Android代码说:
public class MainActivity extends Activity implements OnClickListener {
// Setting up known variables
JavaScriptInterface JSInterface;
Button find;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// changing main layout to show the splash first
setContentView(R.layout.activity_main);
// Tie my webviews and set up the webview to handle JS
WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
// Expecting UI
webView.setWebChromeClient(new WebChromeClient());
// allowing to inject Java objects into a page's JavaScript
webView.addJavascriptInterface(new JavaScriptInterface(this), "webapi");
// Load the local file
webView.loadUrl("file:///android_asset/www/index.html");
find = new Button(MainActivity.this);
find.setOnClickListener(this);
WebSettings ws = webView.getSettings();
ws.setJavaScriptEnabled(true);
// Add the interface to record javascript events
webView.addJavascriptInterface(find, "find");
}
public class JavaScriptInterface {
Context mContext;
// Instantiate the interface and set the context
JavaScriptInterface(Context c) {
mContext = c;
}
// Call the function changeActivity defined in my JS of my HTML
public void changeActivity(String movieName) {
// Call the Movie App and store the intent to pass it onto the app.
Log.e("XXXXXXXXXXXXXXX", "X==========>" + movieName);
Intent i = new Intent(MainActivity.this, second.class);
i.putExtra("movie_name", movieName);
startActivity(i);
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v.equals(find)) {
Log.e("XXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX");
}
}
}
答案 0 :(得分:13)
问题正是如此。由于你在4.2.2上运行,你必须在你的changeActivity方法和你在android代码中调用的任何其他javascript方法之上设置 @JavascriptInterface 注释。
@JavascriptInterface
public void changeActivity(String movieName) {
...
对于Android 4.2或更高版本,这是必需的。
按照此link阅读更多内容。
答案 1 :(得分:5)
首先在Android 4.2及更高版本上,确保添加了@JavascriptInterface注释。
然后,如果您发现它在发布(生产)模式下停止工作,那是因为proguard
。
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
# -keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
答案 2 :(得分:2)
如果设备是4.2.2,则必须设置注释@JavascriptInterface。 但不幸的是,4.2.2之前的SDK中没有此接口。
对于这种情况,您有两个选择:
更改应用的目标,从4.0 / 4.1更改为4.2
如果您不想更改目标,请在您自己的源代码中创建一个java文件android / webkit / JavascriptInterface.java并复制4.2 SDK中的内容