Android学习之WebView

什么是WebView

WebView是Android中UI组件的一种,WebView基于webkit内核,不过由于兼容性的原因在Android5.0后改为了Chromium内核。
WebView可以用来展示网页,常用于我们不想打开浏览器但又想浏览网页的情况。

WebView的使用

WebVeiw的常用方法

加载网页的四种方式

loadUrl(String url)

 //打开百度网页
 webView.loadUrl("https://www.baidu.com/");
 //打开sdcard卡的html页面
 //webView.loadUrl("file://" + Environment.getExternalStorageDirectory() + "/1/index.html");
 //资源文件下的html页面
 //webView.loadUrl("file://android_asset/index.html");
 
//设置在当前页面打开要显示的网页
 webView.setWebViewClient(new WebViewClient());

loadUrl(String url, Map<String, String> additionalHttpHeaders)
第一个参数是要加载网页的url,第二个参数是键值对形式的请求参数,会被加入到请求头中。

  webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Map<String,String> reqHeaders = new HashMap<>();
                reqHeaders.put("android-webview-demo","testRequestHeaders");
                webView.loadUrl("https://www.baidu.com/");
                return super.shouldOverrideUrlLoading(view, url);
            }
        });

loadData(String data, String mimeType, String encoding)
可以将一段html代码加载到网页中

 webView.loadData("<h1>hello world</h1>","text/html","utf-8");

loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
这里要加载的网页的url是baseUrl+data,mimeType是响应类型,encoding是编码,historyUrl设置回退时回退到哪个网页

    webView.loadDataWithBaseURL("https://www.imooc.com/","<img src = \"static/img/index/logo2020.png\"/> <a href = \"https://www.baidu.com\">百度</a>","text/html","utf-8","https://www.sogou.com");
    webView.setWebViewClient(new WebViewClient());
控制网页的前进和后退

boolean canGoBack():是否可以后退;
boolean canGoForward():是否可以前进;
boolean canGoBackOrForward(int steps):是否可以前进或后退一定步数,负数代表后退,正数代表前进;
void clearHistory():清除历史;
void goBack():后退;
void goForward():前进;
void goBackOrForward(int steps):前进或后退一定步数,负数代表后退,正数代表前进;

public void onClear(View view) {
        webView.clearHistory();
    }

    public void onCanBack(View v) {
        Toast.makeText(this,String.valueOf(webView.canGoBack()),Toast.LENGTH_SHORT).show();
    }

    public void onGoBack(View v) {
        webView.goBack();
    }

    public void onCanGoForward(View v) {
        Toast.makeText(this,String.valueOf(webView.canGoForward()),Toast.LENGTH_SHORT).show();
    }

    public void onGoForward(View v) {
        webView.goForward();
    }

    public void onCanGoBackOrForward(View v) {
        int steps = Integer.valueOf(et.getText().toString());
        Toast.makeText(this,String.valueOf(webView.canGoBackOrForward(steps)),Toast.LENGTH_SHORT).show();
    }

    public void onGoBackOrForward(View v) {
        int steps = Integer.valueOf(et.getText().toString());
        webView.goBackOrForward(steps);
    }
WebView的状态管理

WebView的状态管理用于
WebView的
onPause():
onResume():
resumeTimers():
pauseTimers():
destroy():

WebSettings

使用WebSettings可以对webview进行配置和管理。
控制网页的缩放
setSupportZoom(boolean):是否支持缩放
setBuiltInZoomControls(boolean):设置内置的缩放控件
setDisplayZoomControls(boolean):是否隐藏原生的缩放控件
控制网页缓存策略
LOAD_CACHE_ONLY:永远不使用网络,只去本地缓存,没有缓存则不会加载;
LOAD_CACHE_ELSE_NETWORK:只要本地有缓存,无论是否过期都会去使用本地缓存,没有缓存才会去加载网络;
LOAD_DEFAULT:根据cache-control决定是否从网络获取;
LOAD_NO_CACHE:永远不使用缓存,只从网络获取;

  WebSettings settings = webView.getSettings();
  //设置要访问的页面可以运行js
  settings.setJavaScriptEnabled(true);
  //设置可以进行缩放
 settings.setSupportZoom(true);
 settings.setBuiltInZoomControls(true);
 settings.setDisplayZoomControls(true);
 //设置缓存策略
 settings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);

WebViewClient

WebViewClient处理加载时的各种回调通知。

方法签名作用
WebResourceResponse shouldInterceptRequest(WebViewview, String url)进行资源请求的时候回调
void onPageStarted(WebViewview, String url, Bitmap favicon)网页已经开始加载的时候回调
void onLoadResource(WebViewview, String url)加载网页资源之前回调
boolean shouldOverrideUrlLoading(WebView view, String url)webview将要加载新的url时进行回调
void onReceivedError(WebViewview, interrorCode, String description, String failingUrl)网页访问发生错误的时候回调
void onPageFinished(WebViewview, String url)网页加载完成的时候回调
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)重载方法,在Android7.0以后才能使用
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)重载方法,在Android5.0以上才能使用
void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)重载方法,Android6.0及以上才能使用
shouldInterceptRequest方法会在onLoadResource方法之前被调用。
webView.setWebViewClient(new WebViewClient() {

           @Override
           public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
               super.onReceivedError(view, request, error);
           }

           @Override
           public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
               super.onReceivedError(view, errorCode, description, failingUrl);
           }

           /**
            * android7.0以上才可以使用,可以利用此方法进行方法拦截
            * @param view
            * @param request
            * @return
            */
           @Override
           public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
               return super.shouldOverrideUrlLoading(view, request);
           }

           @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Map<String,String> reqHeaders = new HashMap<>();
                reqHeaders.put("android-webview-demo","testReqHeaders");
                webView.loadUrl("http://192.168.2.124:3000", reqHeaders);

                return super.shouldOverrideUrlLoading(view, url);
            }

           /**
            * android5.0以上才能调用
            * @param view
            * @param request
            * @return
            */
           @Nullable
           @Override
           public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
               Log.d(TAG, "shouldInterceptRequest: 方法被调用了");
                return super.shouldInterceptRequest(view, request);
           }

           @Nullable
           @Override
           public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
               Log.d(TAG, "shouldInterceptRequest: 方法被调用了" + url);
               return super.shouldInterceptRequest(view, url);
           }

           @Override
           public void onPageStarted(WebView view, String url, Bitmap favicon) {
               Log.d(TAG, "onPageStarted: 网页开始进行加载url: " + url);
               super.onPageStarted(view, url, favicon);
           }

           @Override
           public void onLoadResource(WebView view, String url) {
               Log.d(TAG, "onLoadResource:网页开始加载资源url: " + url);
               super.onLoadResource(view, url);
           }

           @Override
           public void onPageFinished(WebView view, String url) {
               Log.d(TAG, "onPageFinished: 网页已经加载完成: " + url);
               super.onPageFinished(view, url);
           }
       });

WebChromeClient

辅助webview去处理JavaScript对话框、标题、进度。

booleanonJsAlert(WebViewview, String url, String message, JsResultresult):在网页将要打开一个alert警告对话框的时候回调;
booleanonJsPrompt(WebViewview, String url, String message, String defaultValue, JsPromptResultresult):在网页将要打开一个prompt对话框的时候回调;
booleanonJsConfirm(WebViewview, String url, String message, JsResultresult):在网页将要打开一个confirm对话框的时候回调;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值