【工具类】Android WebView简单封装

818 阅读3分钟

一、webView基本用法

一、 基本使用:WebView全面解析

1、基本方法

  1. loadUrl()方法:传入需要展示的网页。
  2. getSettings():可以设置一些浏览器的属性。
  3. setJavaScriptEnabled():让WebV iew 支持JavaScript 脚本。
  4. setWebViewClient():传入了一个WebV iewClient 的实例,控制网页跳转时由当前WebView显示,而不是打开系统浏览器。
  5. CacheMode:灵活点的话可以根据当前是否有网络判断使用的策略。
  • LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据;
  • LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据;
  • LOAD_NO_CACHE: 不使用缓存,只从网络获取数据;
  • LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
  1. loadWithOverviewMode:超出屏幕宽度时自适应屏幕。
  2. domStorageEnabled:DOM storage API 功能,使LocalStorage生效。
  3. useWideViewPort:设置true则支持页面viewport属性标签。
  4. loadsImagesAutomatically:false为取消图片加载
  5. webSetting.blockNetworkImage = true :阻塞图片加载
  1. Webview.clearHistory();清除当前webview访问的历史记录;
  2. Webview.clearFormData();仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据。

2、 声明权限 <uses-permission android:name="android.permission.INTERNET" />

3、 初级样例代码【仓库里不是这样的】

  1. 代码
class MainActivity : AppCompatActivity() {
    private var webView:WebView ?= null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        webView = findViewById<View>(R.id.web_view) as WebView
        webView!!.settings.javaScriptEnabled = true//支持h5


        //webView!!.webViewClient = WebViewClient()//APP内部new一个Client来进行WebView预览
        webView!!.loadUrl("https://www.baidu.com")
        //webView!!.webViewClient=WebViewClient()
        //url发生重定向处理
        webView!!.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                if (url == null) {
                    return false
                }
                if (url.startsWith("weixin://") || url.startsWith("alipays://") || url.startsWith("tel://")) {
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                    startActivity(intent)
                    return true
                }
                if (url.startsWith("http://") || url.startsWith("https://")){
                    view?.loadUrl(url)
                }else{
                    //非http和https文件的使用这个
                    val intent =Intent(Intent.ACTION_VIEW,Uri.parse(view?.url))
                    this@MainActivity.startActivity(intent)
                }

                return super.shouldOverrideUrlLoading(view, url)
            }
        }
    }
//监听按键返回
    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK && webView?.canGoBack() == true) {
            webView!!.goBack()
            return true
        }
        return super.onKeyDown(keyCode, event)
    }

    override fun onDestroy() {
        super.onDestroy()
        //清除网页访问留下的缓存
        //由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
        webView?.clearCache(true)

        //清除当前webview访问的历史记录
        //只会webview访问历史记录里的所有记录除了当前访问记录
        webView?.clearHistory()

        //这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据
        webView?.clearFormData()
    }
}

  1. 对应xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

</androidx.constraintlayout.widget.ConstraintLayout>

  1. 加载方式
    //方式一:加载一个网页
    webView.loadUrl("http://www.baidu.com");

    //方式二:加载应用资源文件内的网页
    webView.loadUrl("file:///android_asset/test.html");

    //方式三:加载一段代码
    webView.loadData(String data,String mimeType, String encoding);
  1. 浏览器的前进与后退
  • 点击系统返回键时,是结束当前的Activity,而非调用WebView的goBack()
  //WebView是否可以后退
  boolean canGoBack = webView.canGoBack();
  //WebView后退
  webView.goBack();
  //WebView是否可以前进
  boolean canGoForward = webView.canGoForward();
  //WebView前进
  webView.goForward();
  //以当前的index为起始点前进或者后退到历史记录中指定的steps
  //如果steps为负数则为后退,正数则为前进
  boolean canGoBackOrForward = webView.canGoBackOrForward(step);

其他感谢与参考文章

1、基础知识

  1. Android集成三方浏览器之X5内核
  • 腾讯的
  1. Android集成三方浏览器之Crosswalk
  • 英特尔的,已停止维护,官网都没了

3、 Webview&Viewpager滑动冲突解决方案

4、 Android:这是一份全面&详细的Webview使用攻略

5、 Webview 重定向和 net::ERR_UNKNOWN_URL_SCHEME 解析及解决方案