Android中WebView的基本配置与填坑记录大全

Android中WebView的基本配置与填坑记录大全

本文将详细介绍Android中WebView的基本配置和一些坑点记录。WebView是Android中经常用到的控件,它能够方便地显示Web页面或者本地HTML页面,同时也支持JavaScript交互。

1. 添加依赖

build.gradle的dependencies中添加如下依赖:

implementation 'androidx.webkit:webkit:1.4.0'

2. 添加网络权限

AndroidManifest.xml中添加如下权限:

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

3. 布局文件中添加WebView

在布局文件中添加WebView:

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

4. 初始化WebView

在Activity的onCreate方法中,获取WebView实例并进行一些基本配置:

WebView webView = findViewById(R.id.web_view);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true); // 开启JavaScript支持
settings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不使用缓存

5. 加载Web页面

可以通过loadUrl方法加载Web页面:

webView.loadUrl("https://www.example.com");

也可以通过loadData方法加载HTML页面:

String html = "<html><h1>Hello world</h1></html>";
webView.loadData(html, "text/html", "UTF-8");

6. WebView与JavaScript交互

6.1 WebView调用JavaScript方法

通过evaluateJavascript方法调用JavaScript方法:

webView.evaluateJavascript("javascript:alert('hello')", null);

6.2 JavaScript调用WebView方法

在WebView中添加JavaScript接口:

public class WebViewJavaScriptInterface {
    @JavascriptInterface
    public void showMessage(String message) {
        Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
    }
}

webView.addJavascriptInterface(new WebViewJavaScriptInterface(), "android");

在JavaScript代码中调用:

android.showMessage("hello");

填坑记录

1. WebView加载页面时如何统一携带请求头

在WebView加载页面时,可以通过WebViewClient的onPageStarted方法来统一携带请求头:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        Map<String, String> headers = new HashMap<>();
        headers.put("User-Agent", "Mozilla/5.0");
        view.loadUrl(url, headers);
    }
});

2. WebView页面缓存问题

在WebSettings中设置CacheMode为LOAD_NO_CACHE可以禁用WebView缓存。如果需要缓存,则需要设置缓存路径和缓存模式:

String cacheDirPath = getFilesDir().getAbsolutePath() + "/webcache";
settings.setAppCachePath(cacheDirPath);
settings.setAllowFileAccess(true);
settings.setAppCacheEnabled(true);
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

同时,在WebViewClient中处理缓存:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            return super.shouldInterceptRequest(view, request);
        }
        String url = request.getUrl().toString();
        WebResourceResponse response = null;
        try {
            URLConnection connection = new URL(url).openConnection();
            InputStream inputStream = connection.getInputStream();
            Map<String, List<String>> headers = connection.getHeaderFields();
            String mimeType = connection.getContentType();
            String encoding = connection.getContentEncoding();
            response = new WebResourceResponse(mimeType, encoding, inputStream);
            response.setResponseHeaders(headers);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }
});

示例说明

示例1:WebView加载百度页面

在Activity中添加如下代码:

WebView webView = findViewById(R.id.web_view);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        Map<String, String> headers = new HashMap<>();
        headers.put("User-Agent", "Mozilla/5.0");
        view.loadUrl(url, headers);
    }
});
webView.loadUrl("https://www.baidu.com");

示例2:WebView加载本地HTML页面

在Activity中添加如下代码:

WebView webView = findViewById(R.id.web_view);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
String html = "<html><h1>Hello world</h1></html>";
webView.loadData(html, "text/html", "UTF-8");

总结

本文介绍了Android中WebView的基本配置和一些坑点记录。希望本文能够帮助你更好地使用WebView。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中WebView的基本配置与填坑记录大全 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS将unicode码转中文方法

    将 Unicode 码转换为对应中文字符的方法,通常使用 JavaScript 中的 String.fromCharCode() 方法。该方法能够将 Unicode 码值转换为对应字符,需要传入 Unicode 码值(数值形式)作为参数,返回对应的字符。 下面是将 Unicode 码转换为对应中文字符的示例: 示例 1: const unicodeStr =…

    JavaScript 2023年5月19日
    00
  • js前端图片加载异常兜底方案

    针对JS前端图片加载异常兜底方案,以下是完整攻略: 1. 使用onerror事件 当图片加载出现异常时,浏览器会触发<img>标签的onerror事件。我们可以利用这个事件进行图片加载异常处理。 <img src="./image.png" onerror="this.src=’./default.png’&q…

    JavaScript 2023年5月28日
    00
  • JS验证input输入框(字母,数字,符号,中文)

    这里给出JS验证输入框的完整攻略。我们需要以下步骤来完成验证: 获取输入框元素 给输入框元素绑定事件监听器,以便在输入内容时能够及时验证 在事件监听器的回调函数中,通过正则表达式对输入内容进行验证 根据验证结果,决定是否将输入内容存储到变量或者进行其他操作 下面我们详细分析每个步骤,以及提供两个示例。 步骤1:获取输入框元素 我们可以使用 document.…

    JavaScript 2023年6月10日
    00
  • 用js判断用户浏览器是否是XP SP2的IE6

    要判断用户浏览器是否是XP SP2的IE6,可以使用以下步骤: 通过user-agent判断操作系统及浏览器版本 首先,可以通过获取用户浏览器的user-agent信息。在JavaScript中,可以通过navigator.userAgent获取,返回的是一个字符串,包含了用户浏览器的操作系统、浏览器版本等信息。 例如,下面代码中的userAgent变量就保…

    JavaScript 2023年6月11日
    00
  • JavaScript 映射器 array.flatMap()

    JavaScript的映射器array.flatMap()方法可以将一个数组的每个元素映射到另一个数组中,然后将所有的映射结果压缩成一个新数组。这个方法适用于一些场景,例如需要从一个二维数组中提取子数组元素,或者想要将多个数组合并成一个新的数组。下面是详细的攻略: 1. 语法 array.flatMap(callback(currentValue[, ind…

    JavaScript 2023年5月27日
    00
  • JavaScript获取对象key的几种方法和区别

    下面是关于“JavaScript获取对象key的几种方法和区别”的详细讲解。 1. 对象属性的基本概念 在 JavaScript 中,对象是指一个或多个属性的集合。一个属性包括一个名字和一个值,名字通常称之为属性名或 key,它可以是一个字符串或者一个 Symbol(ES6中的一种数据类型)。 我们可以通过以下方式定义一个对象: const obj = {k…

    JavaScript 2023年5月27日
    00
  • 用javascript实现画图效果的代码

    下面是用JavaScript实现画图效果的代码攻略: 1. 准备工作 在开始写代码之前,需要确认一些准备工作: 在HTML文件中添加一个画板的容器元素,可以是<canvas>标签或者其他类型的块级元素。 在HTML文件中引入JavaScript文件。 为画板添加事件监听器,例如mousedown、mousemove、mouseup等事件。 2. …

    JavaScript 2023年6月11日
    00
  • 利用jsonp跨域调用百度js实现搜索框智能提示

    利用 JSONP 跨域调用百度 JS 实现搜索框智能提示是一个常见的前端开发技巧。本篇攻略将详细讲解 JSONP 的使用步骤以及相应的注意事项。 一、JSONP 的基础知识 JSONP(JSON with Padding)是一种跨域技术,它利用了 script 标签的跨域特性来实现。通常情况下,我们在同源代码中无法通过 AJAX 请求一个跨域的 API,这时…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部