我有一个带有网络视图的活动。 当用户与 Web 视图交互时,它通过 JavaScriptInterface 执行此操作,以便应用程序和 Web 视图可以相互交互。 我相信该类默认情况下是静态的,所以我发现如果不扩展 MainActivity,就无法做太多事情。
public class JSInterface extends MainActivity {
private MainActivity mainActivity;
JSInterface(Context context, MainActivity mActivity) {
mainActivity = mActivity;
}
@JavascriptInterface
public void someMethod() {
mainActivityMethod(webViewData);
}
// other methods
}
在我的主活动中,我有:
WebView webView = findViewById(R.id.webView);
JSInterface JSInterface = new JSInterface(this, this);
//other methods called by JSInterface, e.g.
@Override
public void mainActivityMethod(String webViewData) {
// do something with data
}
因此,我发现通过从JSInterface扩展到MainActivity,我可以从MainActivity调用普通(非静态)方法,这是非常必要的。 如果我不将其扩展到 MainActivity,它似乎是一个静态类,并且在尝试调用 MainActivity 方法或引用任何非静态内容时出现此错误:
Non-static method someMethod() cannot be referenced from a static context.
它按原样工作,但我觉得这不是最好的方法。 我说的对吗? 做到这一点的"最佳"方法是什么?或者其他方式,最好是主观的。
这不是最好的方法
永远不要创建Activity
的子类,除非您打算以startActivity()
开头。
的"最佳"方法是什么?
一种选择是简单的组合,摆脱不正确的继承:
public class JSInterface {
private MainActivity mainActivity;
JSInterface(MainActivity mActivity) {
mainActivity = mActivity;
}
@JavascriptInterface
public void someMethod() {
mainActivity.something(webViewData);
}
// other methods
}
另一个是嵌套类。在此示例活动中,Locater
是我的GeoWebOne
活动内部的嵌套类,因此Locater
可以调用方法和访问GeoWebOne
中的字段。简单的组合方法是一个更好的答案,尽管嵌套类可以工作。