可以从JavaScriptInterface扩展到MainActivity以避免非静态错误吗?

时间:2019-05-19 11:52:43

标签: android

我有一个带有网络视图的活动。 当用户与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.

它按原样工作,但是我觉得这不是解决问题的最佳方法。 我对吗? 做到这一点的“最佳”方法是什么?或其他方式,最好是主观的。

1 个答案:

答案 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中的方法和访问字段。尽管可以使用嵌套类,但是简单的组合方法是一个更好的答案。