【问题标题】:Call MainActivity method from another class in android从android中的另一个类调用MainActivity方法
【发布时间】:2019-01-24 10:40:30
【问题描述】:

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

我使用Passing data from java class to 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
    }
}

【问题讨论】:

    标签: javascript java android webview


    【解决方案1】:

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

    一般来说,您不应该以这种方式创建新的 MainActivity 实例。要打开一个新的 MainActivity,请使用 Intent。

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

    一个简单的解决方法:

    MainActivity.this.myMethod("Hello there")
    

    您不必存储 mContext 。你已经在 MainActivity 里面了。

    所以,完整的代码是:

    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。

    【讨论】:

    • 我的 JavaScriptInterface 类位于 MainActivity.java 文件中。我该如何做到这一点?
    • 更新答案。
    • 感谢 cmets!这个解决方案非常适合我!
    • @Anirban 要将答案标记为正确答案,请按 V。要说明它有很大帮助,您可以按数字上方的向上箭头。
    • 是的,我当然做到了。但我的声望不超过 15。
    【解决方案2】:

    您正在创建 MainActivity 的另一个对象,这就是它没有显示的原因。您正在将活动上下文传递给界面,因此您可以

    ((MainActivity)mContext).myMethod();
    

    示例 MainActivity

    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");
        }
    }
    
    }
    

    Check out android documentation for more info

    【讨论】:

    • 由于它不是静态类,而是MainActivity的一部分,所以不需要存储mContext,可以直接访问MainActivity实例。
    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2018-02-27
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2015-03-27
    • 2016-08-06
    相关资源
    最近更新 更多