Android与H5互调

Android与H5互调

WebView基本用法

当然,访问网页需要权限

<uses-permission android:name="android.permission.INTERNET"/>
private void initWebView() {
    //1.加载网页-H5,html,自定义浏览器,直接在webview中播放视频
    WebView webView = new WebView(this);
    WebSettings webSettings = webView.getSettings();
    //设置支持javascript(js)
    webSettings.setJavaScriptEnabled(true);
    //不调用浏览器-自定义浏览器
    webView.setWebViewClient(new WebViewClient());
    //加载网络的网页-本地的网页
    webView.loadUrl("https://blog.csdn.net/Erin_jwx");
    //加载本地的html页面
  //webView.loadUrl("file:///android_asset/JavaAndJavaScriptCall.html");
    setContentView(webView);
}

java调用js

这里用的是本地的html代码

1.要在Moudle的main文件夹下(就是有java和res的文件夹)创建一个assets的目录(directory),然后将这个html文件复制进去

2.使用上面webview的相关代码。修改url

webView.loadUrl("file:///android_asset/JavaAndJavaScriptCall.html");

这里还没有调用,只是测试本地html的加载

在这里插入图片描述

这里用了尚硅谷的进行测试(图片没有加载出来,但是不影响互调

我们想要让登陆账号的名称显示在上图谷粉的位置(网页是登录后加载的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ycophXkW-1625378318927)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210704113330247.png)]

因为html中已经有了名称替换的实现

function javaCallJs(arg){
		 document.getElementById("content").innerHTML =
	         ("欢迎:"+arg );
	}

所以java中调用这个,就可以完成实现想要的功能,这就是java调用H5(调用H5本质上是调用js)

1.在运行时就初始化WebView(即在onCreate方法中调用),但是这个时候还不能setContentView

2.登录时不是调用initWebView了,而是调用重新写login(number)方法,传入的参数就是用户名

3.在login(number)方法中调用js代码,以及setContentView

private void login(String number) {
        webView.loadUrl("javascript:javaCallJs("+ "'"+ number+"'" +")");
        setContentView(webView);
    }

这个时候重新运行,可以看到调用成功!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3JaD0Z0-1625378318929)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210704132631273.png)]

js调用java

既然叫做互调,那么除了java可以调用js外,js也可以调用java

1.在初始化WebView时添加JavascriptInterface

这个时候参数还不完善

webView.addJavascriptInterface();

2.创建一个类 AndroidAndJsInterface,这里面写的方法是可以被js调用的

在给出的html代码里已经有写调用java的代码

<input type="button" value="点击Android被调用" onclick="window.Android.showToast()" />

它调用的是showToast(),那么我们要有这个方法才能让js调用

所以在这个类里面写上这个方法

class AndroidAndJsInterface{

        @JavascriptInterface
        public void showToast()
        {
            Toast.makeText(JavaAndJsCallActivity.this, "我是Android代码,我被js调用了", Toast.LENGTH_SHORT).show();
        }
    }

注意这个方法上面有一个注解@JavascriptInterface

这是为了解决WebView.addJavascriptInterface接口不起作用而处理的

3.我们第一步的参数还没填好,现在可以填了

一个参数填的是AndroidAndJsInterface类的对象,第二个参数就是方法前面的字段,可以看到html代码里showToast前面有个字段Android,这里的参数一定要和这个字段匹配

webView.addJavascriptInterface(new AndroidAndJsInterface(),"Android");

这样就可以实现js调用java
结果如下
在这里插入图片描述

完整代码

public class JavaAndJsCallActivity extends Activity implements View.OnClickListener {

    private EditText etNumber;
    private EditText etPassword;
    private Button btnLogin;
    private WebView webView;

    /**
     * Find the Views in the layout<br />
     * <br />
     * Auto-created on 2021-07-04 10:16:32 by Android Layout Finder
     * (http://www.buzzingandroid.com/tools/android-layout-finder)
     */
    private void findViews() {
        etNumber = (EditText)findViewById( R.id.et_number );
        etPassword = (EditText)findViewById( R.id.et_password );
        btnLogin = (Button)findViewById( R.id.btn_login );

        btnLogin.setOnClickListener( this );
    }

    /**
     * Handle button click events<br />
     * <br />
     * Auto-created on 2021-07-04 10:16:32 by Android Layout Finder
     * (http://www.buzzingandroid.com/tools/android-layout-finder)
     */
    @Override
    public void onClick(View v) {
        if ( v == btnLogin ) {
            // Handle clicks for btnLogin
            String number = etNumber.getText().toString().trim();
            String password = etPassword.getText().toString().trim();
            if(TextUtils.isEmpty(number)||TextUtils.isEmpty(password))
            {
                //账号和密码有空
                Toast.makeText(this,"账号或密码不能为空",Toast.LENGTH_SHORT).show();
            }
            else
            {
                Toast.makeText(this,"登录",Toast.LENGTH_SHORT).show();
                //initWebView();
                login(number);
            }
        }
    }

    private void login(String number) {
        webView.loadUrl("javascript:javaCallJs("+ "'"+ number+"'" +")");
        setContentView(webView);
    }

    private void initWebView() {
        //1.加载网页-H5,html,自定义浏览器,直接在webview中播放视频
        webView = new WebView(this);
        WebSettings webSettings = webView.getSettings();
        //设置支持javascript(js)
        webSettings.setJavaScriptEnabled(true);
        //不调用浏览器-自定义浏览器
        webView.setWebViewClient(new WebViewClient());
        //加载网络的网页-本地的网页
        //webView.loadUrl("https://blog.csdn.net/Erin_jwx");

        //添加JavascriptInterface
        //以后js通过Android字段调用AndroidJsInterface中的任何方法
        webView.addJavascriptInterface(new AndroidAndJsInterface(),"Android");

        //加载本地的html页面
        webView.loadUrl("file:///android_asset/JavaAndJavaScriptCall.html");
        //setContentView(webView);
    }

    class AndroidAndJsInterface{

        @JavascriptInterface
        public void showToast()
        {
            Toast.makeText(JavaAndJsCallActivity.this, "我是Android代码,我被js调用了", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_java_and_js);
        findViews();
        initWebView();
    }

    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }
}

附加

html文件下载地址:
链接:https://pan.baidu.com/s/1AyGHqEMSB0XFCREo5aZ1Ww
提取码:vpq8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值