android-WebView使用

一、WebView简单介绍

WebView可以当做一个浏览网页使用,使用的是WebKit渲染加载的。

1、声明布局

<WebView
    android:id="@+id/mWebView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />  

2、简单使用

mWebView = (WebView) findViewById(R.id.mWebView);
mWebView.loadUrl("http://www.baidu.com/");

二、具体使用

使用上述会发现可以简单加载出网页,但是一些图片,布局还是有问题,所以需要进行相关的设置,其中主要的流程mWebView->webSettings->webClient

1、网络权限

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

2、进行WebSettings类的相关设置

//声明WebSettings子类
WebSettings webSettings = webView.getSettings();

//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript,开启后
webSettings.setJavaScriptEnabled(true);  
mWebview.getSettings().setBlockNetworkImage(false);//解决图片不显示
//注意此问题,android5.0后不允许Https与Http混用,所以要区分设置,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  
     webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);  
} 
//支持插件
webSettings.setPluginsEnabled(true); 

//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小 
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

//缩放操作
webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

//其他细节操作
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存 
webSettings.setAllowFileAccess(true); //设置可以访问文件 
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

设置WebView缓存

  • 当加载 html 页面时,WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹
  • 请求的 URL记录保存在 WebViewCache.db,而 URL的内容是保存在 WebViewCache 文件夹下
  • 是否启用缓存:
//优先使用缓存: 
    WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
        //缓存模式如下:
        //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
        //LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
        //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
        //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

    //不使用缓存: 
    WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

3、进行WebClient设置

这一个类中设置的主要是几个,

一个是shouldOverrideUrlLoading控制不调用系统浏览器(旧方法已经在API26的时候不建议使用了)

//步骤1. 定义Webview组件
Webview webview = (WebView) findViewById(R.id.webView1);

//步骤2. 选择加载方式
  //方式1. 加载一个网页:
  webView.loadUrl("http://www.google.com/");

  //方式2:加载apk包中的html页面
  webView.loadUrl("file:///android_asset/test.html");

  //方式3:加载手机本地的html页面
   webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

//步骤3. 复写shouldOverrideUrlLoading()方法,使得打开网页时不调用系统浏览器, 而是在本WebView中显示
    webView.setWebViewClient(new WebViewClient(){
      @Override
      public boolean shouldOverrideUrlLoading(WebView view,WebResourceRequest request) {
          view.loadUrl(request.getUrl().toString());
      return true;
      }
  });

goback控制按返回键的时候是返回上一层还是直接退出

mWebView.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
            // 返回键退回
            mWebView.goBack();
            return true;
        } else
            return false;
    }
});

onPageStarted()作用:开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应。

webView.setWebViewClient(new WebViewClient(){
      @Override
      public void  onPageStarted(WebView view, String url, Bitmap favicon) {
         //设定加载开始的操作
      }
  });

onPageFinished()作用:在页面加载结束时调用。我们可以关闭loading 条,切换程序动作。

 webView.setWebViewClient(new WebViewClient(){
      @Override
      public void onPageFinished(WebView view, String url) {
         //设定加载结束的操作
      }
  });

其他方法:

onReceivedError 报告错误信息 
onLoadResource 加载指定地址提供的资源 
doUpdate VisitedHistory 更新历史记录 
onFormResubmission 应用程序重新请求网页数据 
onScaleChanged WebView发生改变

4、进行WebChromeClient设置

主要是与Js进行交互,因为没使用,不过多赘述,可参考

onProgressChanged 加载进度条改变 
onJsPrompt 用在解决4.2以下addJavascriptInterface漏洞问题 
onCloseWindow 关闭WebView 
onCreateWindow 创建WebView 
onJsAlert 处理Javascript中的Alert对话框 
onJsConfirm处理Javascript中的Confirm对话框 
onJsPrompt处理Javascript中的Prompt对话框 
onReceivedlcon 网页图标更改 
onReceivedTitle 网页Title更改 
onRequestFocus WebView显示焦点 
onConsoleMessage 在Logcat中输出javascript的日志信息

5、避免WebView内存泄漏

1)、不再xml中设置WebView,而是在代码中实现,传入ApplicationContect

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        mWebView = new WebView(getApplicationContext());
        mWebView.setLayoutParams(params);
        mLayout.addView(mWebView);
2)、  在 Activity 销毁( WebView )的时候,先让 WebView 加载null内容,然后移除 WebView,再销毁 WebView,最后置空
@Override
    protected void onDestroy() {
        if (mWebView != null) {
            mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            mWebView.clearHistory();

            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
            mWebView.destroy();
            mWebView = null;
        }
        super.onDestroy();
    }


可参考: http://blog.csdn.net/kui2015/article/details/52249262
             http://blog.csdn.net/carson_ho/article/details/52693322







猜你喜欢

转载自blog.csdn.net/wzhworld/article/details/79504844