我目前正在Webview中以HTML格式向用户显示一堆数据。我在每个条目下方都有一些链接,单击这些链接时应在我的应用程序中调用方法。 Android WebView的javascript界面似乎是处理这些事情的最佳方式(唯一的方式)。但是,每当我单击链接时,都会出现以下错误消息:ERROR/Web Console(6112): Uncaught TypeError: Object [my namespace]@4075ff10 has no method 'edit' at [base URL]:55
我声明了以下接口(interface):
public class JavaScriptInterface {
Context context;
JavaScriptInterface(Context c) {
context = c;
}
public void edit(String postid) {
Log.d("myApp", "EDIT!");
//do stuff
}
}
然后,将其添加到我的WebView中:
final WebView threadView = (WebView) findViewById(R.id.webViewThread);
threadView.getSettings().setJavaScriptEnabled(true);
threadView.addJavascriptInterface(new JavaScriptInterface(this), "Android");
最后,我在HTML中将其称为:
<div class="post-actions">
<div class="right">
<a onClick="Android.edit('4312244');">Edit</a>
</div>
</div>
真正的启动器是,当我通过仿真器或与手机的adb连接调试应用程序时,所有这些都可以使用。当我构建和发布该应用程序时,它坏了。
我机智。任何帮助或建议,将不胜感激!
最佳答案
我的2.3.3手机也有同样的问题。
但是,由于我知道一个应用程序有效而另一个应用程序无效,因此我对这种解决方法不满意。
而且我发现了我两个应用程序的区别。
损坏的JavaScriptInterface使用Proguard 。
稍作搜索后,我发现了solution。
简短摘要:接口(interface)JavascriptCallback,由JavaScriptInterface实现,并在proguard.conf中为Proguard添加了规则:
public interface JavascriptCallback {
}
public class JavaScriptInterface implements JavascriptCallback {
Context mContext;
/** Instantiate the interface and set the context */
JavaScriptInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
}
proguard.cfg:
-keep public class YOURPACKAGENAMEHERE.JavascriptCallback
-keep public class * implements YOURPACKAGENAMEHERE.JavascriptCallback
-keepclassmembers class * implements YOURPACKAGENAMEHERE.JavascriptCallback {
<methods>;
}