我有一个带有网络视图的活动。 当用户与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
}
在我的MainActivity中,我有:
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.
它按原样工作,但是我觉得这不是解决问题的最佳方法。 我对吗? 做到这一点的“最佳”方法是什么?或其他方式,最好是主观的。
答案 0 :(得分:0)
我觉得这不是最好的解决方法
除非要以Activity
开头,否则请勿创建startActivity()
的子类。
做到这一点的“最佳”方法是什么?
一种选择是简单的组合,摆脱不适当的继承:
public class JSInterface {
private MainActivity mainActivity;
JSInterface(MainActivity mActivity) {
mainActivity = mActivity;
}
@JavascriptInterface
public void someMethod() {
mainActivity.something(webViewData);
}
// other methods
}
另一个是嵌套类。在this sample activity中,Locater
是我的GeoWebOne
活动中的嵌套类,因此Locater
可以调用GeoWebOne
中的方法和访问字段。尽管可以使用嵌套类,但是简单的组合方法是一个更好的答案。