从 android 中的另一个类调用 MainActivity 方法



我正在开发一个安卓应用程序。我想将一些值从我的webview传递到我的安卓应用程序。

我通过使用将数据从java类传递到Web View html中给出的解决方案成功地解决了这个问题。

我面临的问题是当我尝试从JavaScriptInterface.java调用MainActivity方法时,未调用这些方法或未给出任何错误。

这是我到目前为止尝试过的:

MainActivity act=new MainActivity();
act.myMethod() //This method is available in my activity

但它没有被召唤。

((MainActivity)getActivity).myMethod();
    public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppTheme);
        setContentView(R.layout.activity_main);
    }
    public void myMethod() {
        Toast.makeText(this, "Inside MainActivity", Toast.LENGTH_SHORT).show();
    }
}
//JavaScriptInterface class
    class JavaScriptInterface {
    Context mContext;
    JavaScriptInterface(Context c) {
        mContext = c;
    }
    /** Show a toast from the web page */
    @JavascriptInterface
    public void onButtonClick(String toast1, String toast2) {
        Toast.makeText(mContext, toast1+" | "+toast2, Toast.LENGTH_SHORT).show(); //THIS IS WORKING
        MainActivity act=new MainActivity();
        act.myMethod(); //NOT WORKING
    }
}

从技术上讲,myMethod将被调用,但由于您自己创建了 MainActivity,因此它不会附加到任何东西。

通常,您不应以这种方式创建新的 MainActivity 实例。要打开新的主活动,请使用 Intent。

在您的情况下,您应该具有对原始 MainActivity 实例的引用,并在其中调用此方法。不要以任何方式创建一个新的,因为你已经运行了它。

解决它的简单方法:

MainActivity.this.myMethod("Hello there")

您不必存储mContext.您已经在主活动内部。

因此,完整的代码将是:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView myWebView = findViewById(R.id.webview);
    myWebView.loadUrl("http://www.google.com");
    myWebView.addJavascriptInterface(new WebAppInterface(), "Android");
}
public void myMethod(String test){
    Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
}
public class WebAppInterface {
    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        MainActivity.this.myMethod("Hello there");
    }
}
}

事实上,我认为您甚至可以避免MainActivity.this.,并直接致电myMethod

您正在创建 MainActivity 的另一个对象,这就是它不显示的原因。您将活动上下文传递给接口,以便您可以只

((MainActivity)mContext).myMethod();

示例主活动

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView myWebView = findViewById(R.id.webview);
    myWebView.loadUrl("http://www.google.com");
    myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
}
public void myMethod(String test){
    Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
}
public class WebAppInterface {
    Context mContext;
    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }
    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        ((MainActivity)mContext).myMethod("hello");
    }
}
}

查看安卓文档了解更多信息

最新更新