Android WebView使用

Android WebView使用

今天介绍一个android WebView的使用。这里只介绍一些基础的使用,比如载入本地html,与java层做交互等。

基本使用

在使用webview时,基本上都是从两个地方加载html,一个是assets文件夹下,另外就是从网络获取的html,其实从本地的SD卡里也是可以的,不过我并不推荐这么做,这里也就不介绍了。

载入html

由于出于安全性的考虑,android的webview默认是不支持js的,同时如果有内部跳转的话,也会跳转到手机默认的浏览器上。这里都有做一些相应的处理。详情见以下代码。

 webView.getSettings().setJavaScriptEnabled(true);
 webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                return false;
            }
        });
  //加载assets文件夹下的html
  webView.loadUrl("file:///android_asset/html/index.html");
  //加载网络请求的html
  //webview.loadUrl("http://www.test.com/html/index.html");

使用以上代码,基本上就满足大部分需求了,但是有的时候会发现如果需要载入本地数据的话,比如使用Ajax加载一下本地的json,就会报一个

 jquery-1.9.1.min.js:548 XMLHttpRequest cannot load  aaa.json.
 Cross origin requests are only supported for protocol schemes:
 http, data, chrome, chrome-extension, https, chrome-extension-resource.

基实这也是google在出于安全性考虑,禁止了webview的夸域访问,只是要加上一句话就可以解决。

webView.getSettings().setAllowUniversalAccessFromFileURLs(true);

整个放问的代码就变成了这样

webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
webView.loadUrl("file:///android_asset/html/index.html");
 //加载网络请求的html
  //webview.loadUrl("http://www.test.com/html/index.html");
webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                return false;
            }

        });

注意:如果html内部有网络请求,需要加网络请求权限

webview js与本地程序互动

一般如时使用html的话,都或多或少的需要与本地应用互动,就里就简单介绍一下。

android java层代码调用WebViewjs

其实android调用WebVeiw的JS代码是比较简单的,也是使用loadUrl方法,只是参数有变化,这里就直接上源码了。



public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private WebView webView;

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.run_js).setOnClickListener(this);
        webView = (WebView) findViewById(R.id.webview);\
        //启用webveiw对js的支持
        webView.getSettings().setJavaScriptEnabled(true);
        //为了展示对话框,不写也可以调用js方法
        webView.setWebChromeClient(new WebChromeClient());
        //控制webview跳转时不调用浏览器
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                return false;
            }
        });
        //载入测试hnml
        webView.loadUrl("file:///android_asset/html/index.html");
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.run_js) {
            //调用js中的doJsFun方法,'sss'为参数
            webView.loadUrl("javascript:doJsFun('sss')");
        }
    }
}

再来看一下html的代码,这里为了方便大家理解,把其它代码都删除了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        function doJsFun(a) {
            alert(a);
        }

    </script>
</head>
<body>

</body>
</html>

webview中js回调java方法

如果js需要回调java方法,只需要几上面代码进行几处修改,详见以下代码。

  //需要放在上文中的oncreate方法中
  webView.addJavascriptInterface(this, "javaNative");
  //js回调的方法,@JavascriptInterface这个注解一定要加,不然js无法找到此方法
  //此方法不能为静态或私有方法
  @JavascriptInterface
  public void doJavaFun(String str) {
      Toast.makeText(this, str, Toast.LENGTH_LONG).show();
  }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        function doJsFun(a) {
         self.location='www.baidu.com';

        }
        //回调java层方法
        function doJavaFun() {
            //javaNative为通过  webView.addJavascriptInterface(this, "javaNative");注入
            //doJavaFun为java层方法,sss为参数,
            javaNative.doJavaFun("ssss");
        }


    </script>
</head>
<body>
<input type="button" value="调用java方法" onclick="doJavaFun()">
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

a13069730106

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

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

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

打赏作者

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

抵扣说明:

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

余额充值