在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);
}
}
答案 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);
}
});