Android JavascriptInterface使用上下文来调用活动中的方法(OOP)

时间:2017-06-24 17:01:29

标签: android oop

OOP中,我可以使用该对象来调用其方法。所以我想在android中使用相同的概念。但是,它不起作用。我使用context来调用函数updateLvl(int),但它说该方法无法解析。我想知道如何使用context来调用方法updateLvl

public class MainActivity extends Activity {

private WebView webview;
SharedPreferences sharedPref;
SharedPreferences.Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);


    sharedPref = this.getPreferences(0);
    editor = sharedPref.edit();

    webview = new WebView(this);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.addJavascriptInterface(new WebViewJavaScriptInterface2(this), "app");


public void updateLvl(int newLvl){
    sharedPref = this.getPreferences(0);
    editor = sharedPref.edit();
    int be4Level = sharedPref.getInt("currLevel", 1);
    if (newLvl >= be4Level){
        editor.putInt("currLevel", newLvl);
        editor.commit();
    }
  }


}

class WebViewJavaScriptInterface2{

private Context context;
/*
 * Need a reference to the context in order to sent a post message
 */
public WebViewJavaScriptInterface2(Context context){
    this.context = context;
}

@JavascriptInterface
public void openLvl(int lvl){
    context.updateLvl(lvl);
}

}

3 个答案:

答案 0 :(得分:2)

您需要将context转换为MainActivity,因为您的MainActivity类具有updateLvl方法而非Context类,因此编译器会在应用静态时显示错误结合

@JavascriptInterface
public void openLvl(int lvl){
    if(context instanceof MainActivity) // add safety check if required
        ((MainActivity)context).updateLvl(lvl);
}

答案 1 :(得分:1)

Context不是你WebViewJavaScriptInterface2的实例,而是android系统的一个类(以及Activity)。

一种方法是按照Pavneet的建议将上下文转换为活动。但是这有一个缺陷,你不能完全确定你的WebViewJavaScriptInterface2是从正确的活动实例化的。如果你把它投射到那个活动,你也可以从一个活动中使用它。

更简洁的方法是定义回调接口,在您的活动(或多个活动)中实现该接口,并将该回调接口传递到WebViewJavaScriptInterface2

答案 2 :(得分:0)

这可能会帮助某人。

new Handler(Looper.getMainLooper())
  .post(new Runnable(){
    @override
    public void run(){
      updateLvl(lvl);
    }
  });