为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2022-05-21 20:54:32
我正在开发一个安卓应用程序。我想将我的一些价值传递webview给我的 android 应用程序。我使用Passing data from java class to Web View html中给出的解决方案成功解决了这个问题。我面临的问题是当我尝试从 调用MainActivity方法时JavaScriptInterface.java,没有调用这些方法或没有给出错误。这是我到目前为止所尝试的: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    }}
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

从技术上讲,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直接调用。


查看完整回答
反对 回复 2022-05-21
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

您正在创建 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");

    }

}


}


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 394 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号