概述Webview与JS互调

概述
一个视图显示web页面。这个类的基础你可以滚自己的web浏览器或简单地显示一些网上的内容在你的活动。它使用WebKit渲染引擎显示web页面,包括方法通过历史向前或者向后导航,放大和缩小,执行文本搜索和更多。

如果我们想用web,首先需要在Android Manifest.xml文件添加 INTERNET 权限

<uses-permission android:name="android.permission.INTERNET" />

接下来我们直接先简单实现加载WebView

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.baidu.com");
//我们直接这么写,会产生调用系统浏览器。
//所以我们要强制在webview打开网页,防止使用系统默认的浏览器打开网页
        webview.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, url);
            }
//网页开始加载
            @Override 
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }
//网页加载结束
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }
        });
webview.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onReceivedTitle(WebView view, String title) {
                //onReceivedTitle可以回调网页的title
                toolbar_title.setText(title);
                super.onReceivedTitle(view, title);
            }

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
            //该方法可以获取到 网页加载的进度, newProgress 进度值。
            //可以在该方法添加进度条
                if (progressbar != null) {
                    progressbar.setMax(100);
                    progressbar.setProgress(newProgress);
                    // 如果进度大于或者等于100,则隐藏进度条
                    if (newProgress >= 100) {
                        progressbar.setVisibility(View.GONE);
                    } else {
                        if (!progressbar.isShown()) {
                            progressbar.setVisibility(View.VISIBLE);
                        }
                        progressbar.setProgress(newProgress);
                    }
                }
                super.onProgressChanged(view, newProgress);
            }
        });

上面讲了一些简单的加载,那么问题来了,在做项目的过程中可能会调用到JavaScript

WebSettings webSettings = myWebView.getSettings();
//1.设置WebView允许调用js
webSettings.setJavaScriptEnabled(true);
 //2.将object对象暴露给Js,调用addjavascriptInterface
webview.addJavascriptInterface(new MyObject(this), "Android");
//3.加载url地址,现在这个demo.html。是我们自己写的一个本地html我们把该文件放到 assets文件夹中
webview.loadUrl("file:///android_asset/demo.html");

demo.html 请自行测试

<html>
<head>
    <title>Js调用Android</title>
    <script>
     function showMyobjToast(toast) {
        Android.showToast(toast);
     }
    function showDialog() {
        Android.showDialog();
    }
    </script>
</head>

<body>
<input type="button" value="Toast提示" onclick="showMyobjToast('曹神前来日狗~')"/>
<input type="button" value="列表对话框" onclick="showDialog();"/>
</body>
</html>
public class MyObject {
    private Context context;

    public MyObject(Context context) {
        this.context = context;
    }
    // @JavascriptInterface注解,必须加上
    //将显示Toast和对话框的方法暴露给JS脚本调用
    @JavascriptInterface 
    public void showToast(String name) {
        Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
    }
    @JavascriptInterface
    public void showDialog() {
        new AlertDialog.Builder(context)
                .setTitle("联系人列表").setIcon(R.mipmap.ic_launcher)
                .setItems(new String[]{"基神", "B神", "曹神", "街神", "翔神"}, null)
                .setPositiveButton("确定", null).create().show();
    }
}

为什么必须加 @JavascriptInterface注解

浏览网页的历史 ,在使用webview可能会用到 返回,前进。

WebView重写URL加载时,它会自动累积的历史访问web页面。你可以通过历史与导航向后和向前goBack()goForward()。 例如,这就是你的活动可以使用设备后退按钮向后导航

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // 检查是否关键事件是后退按钮,如果有历史返回true
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack() {
        myWebView.goBack();
        return true;
    }
    // 如果没有返回键或没有网页历史,则返回退出
    return super.onKeyDown(keyCode, event);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怀君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值