【Android进阶篇】WebView显示网页详解

2023-11-14

概述
WebView是Android用于显示网页的控件。通过WebView,我们可以查看本地的网页,也可以查看网络资源。
本文内容如下:
一、加载本地网页
二、加载网络资源
三、在WebView中使用JavaScript和CSS
四、WebChromeClient介绍
五、WebView的其它功能
一、加载本地网页
使用WebView加载本地网页时,需要把网页放到Android项目根目录下assets文件夹下,然后URL为:file:///android_asset/文件。
下面是示例:
1. 首先创建工程,这步简单;
2. 在activity_main界面文件中放好WebView控件,代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.mywebview.MainActivity" >

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

</RelativeLayout>


3. 创建文件Hello.html,放在assets文件夹下,hello.html内容如下:
<!DOCTYPE html>
<html>
<head><title>Hello</title></head>
<body>
Hello, WebView
</body>
</html>


只显示了一行:Hello, WebView
4. 下面是MainActivity代码:
public class MainActivity extends ActionBarActivity {
 
 private WebView webView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件
        webView = (WebView) findViewById(R.id.webView);
        //装载URL
        webView.loadUrl("file:///android_asset/hello.html");
        //获取焦点
        webView.requestFocus();
    }
   
}


5. 运行后可看到结果如图:
加载本地文件非常简单,我们只要获取到控件后,使用loadUrl这个方法,WebView就自动地去把文件装载到界面里并进行解析。当然,我们的Demo也相当简单,没有用到js、css等文件。下面介绍一下如何访问网络URL。
二、访问网络资源
访问网络资源会稍微复杂一点。我们不仅需要设置URL,而且需要在AndroidMainfest里申请网络权限,最重要的一点,我们需要设置WebViewClient,即用什么应用打开一个URL,如果我们不设置,这个URL就不会被我们的WebView装载,而是由系统浏览器装载。下面来看一下示例,我们先看不设置WebViewClient的:
下面是MainActivity的部分代码:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件
        webView = (WebView) findViewById(R.id.webView);
        //装载URL
        webView.loadUrl("http://www.baidu.com/");
        //获取焦点
        webView.requestFocus();
}


还需要在AndroidManifest中申请网络权限:
<uses-permission android:name="android.permission.INTERNET"/>

运行后,界面效果为:
应用会要我们选择使用什么浏览器打开URL,而不是就使用我们自己的WebView。
下面我们在MainActivity中加上设置WebViewClient的语句,WebViewClient是负责接收处理请求和通知( 可以直接通过Eclipse的Open Declaration的方法看源码的注释):
     
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取控件
        webView = (WebView) findViewById(R.id.webView);
        // 装载URL
        webView.loadUrl("http://www.baidu.com/");
        // 设置WebViewClient来接收处理请求和通知
        webView.setWebViewClient(new WebViewClient(){
        	@Override
        	public boolean shouldOverrideUrlLoading(WebView view, String url) {
        	view.loadUrl(url);
        	// 返回true则表明使用的是WebView
                return true;
            }
        });
        // 获取焦点
        webView.requestFocus();
    }

运行后,结果为:
这就是上网成功了。
三、在WebView中使用JavaScript和CSS
在WebView中使用css文件很容易,只需要在Html中引入一下或写一些style代码就好;但JavaScript就要多一点工作了。
在WebView中使用JavaScript,我们首先需要使用WebSettings给WebView启动JavaScript功能,然后才能使用。另外,在JavaScript中很多功能在WebView中不能直接使用,比如常用的alert就不行,我们需要自己来实现,这个等下再讲。下面我们来实现在WebView中使用JavaScript和CSS。
首先创建一个css文件style.css,和Hello.html文件位于同一目录,内容如下:
body {
 background:#bbbbbb;
 color:red;
}


Hello.html文件内容作一些修改:
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk">
<link rel="stylesheet" href="style.css"></link>
<title>Hello</title></head>
</style>
<body>
<div id="x">Hello, WebView<div>
</body>
<script>
var obj = document.getElementById("x");
obj.innerHTML = "你好"; //将"Hello, WebView"改为"你好"
alert("你好");
console.log("你好");
</script>
</html>


如果成功执行,则"Hello, WebView"将改为"你好",可以先去尝试一下。下面在MainActivity给WebView启用JavaScript:
public class MainActivity extends ActionBarActivity {
 
 private WebView webView;
 
 private String localFile = "file:///android_asset/hello.html";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取控件
        webView = (WebView) findViewById(R.id.webView);
        // 装载URL
        webView.loadUrl(localFile);
        // 设置WebViewClient来接收处理请求和通知
        webView.setWebViewClient(new WebViewClient(){
         @Override
         public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url);
          // 返回true则表明使用的是WebView
                return true;
            }
        });
        //WebSettings负责管理WebView的一些状态,生命周期与WebView一致
        //在WebView生成时同时生成
        WebSettings settings = webView.getSettings();
        //使用WebSettings启用JavaScript
        settings.setJavaScriptEnabled(true);
       
        // 获取焦点
        webView.requestFocus();
    }
   
}


运行后结果:
JavaScript和CSS成功执行(alert除外,并没有弹出对话框)
注:html代码里面我设置的编码是GBK,这是因为我的Eclipse默认编码是GBK,所以一定要设置好自己对应的编码,不然中文会是乱码。
四、 WebChromeClient介绍

WebChromeClient,Chrome处理器,我们可以通过webView.setWebChromeClient(client)来设置,它是一个很重要的组件。通过这个组件我们可以实现JavaScript中的对话框(即alert)、网页加载进度条等。下面通过这个组件就来实现一下上文没能响应的alert函数以及在JavaScript调试过程中十分重要的console.log()函数。实现的方式就是在对应的方法里将JavaScript函数转换为Android里的组件实现。


MainActivity代码如下,细节写在了注释里:

        

<span style="white-space:pre">	</span>//设置WebChromeClient
        webView.setWebChromeClient(new WebChromeClient(){
         
         /**
          * 实现console.log():既然是日志,自然是用Android里的Log.d来实现
          */
         @Override
         public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
          // 直接输出信息即可
          Log.d("JavaScript", consoleMessage.message());
                return true;
            }
         
         /**
          * 实现alert(), 其实只要使用了WebChromeClient就有默认实现
          * 不过我们是以学习为目的,来学一下自己定制吧
          */
         @Override  
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {  
          //创建Android对话框来输出信息
                AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this)  
                        .setTitle("JavaScript对话框").setMessage(message)  
                        .setPositiveButton("ok",  
                                new AlertDialog.OnClickListener() {  
                                    @Override  
                                    public void onClick(DialogInterface dialog,  
                                            int which) {  
                                        result.confirm();
                                        dialog.dismiss();
                                    }  
                                });  
                b.create(); //创建对话框
                b.show();  	//显示对话框
                return true;  
            }
        });

日志输出:
Demo截图:
因为在Html中早就写好了alert和console.log,只是当时没有执行,所以不用修改其它的。从截图可看出,已经成功实现了alert和console.log。
如果想知道WebChromeClient还可以实现哪些功能,可以直接查看源码。
五、WebView的其它功能
WebView还有很多其它的功能,就不一一列举了,上述只讲了几个我觉得比较重要的,还有比如 回退 前进 查看历史记录 设置WebView缓存等功能 也是很重要的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Android进阶篇】WebView显示网页详解 的相关文章

  • 如何对这个字符串进行子串化

    我想得到这个字符串的 4 个部分 String string 10 trillion 896 billion 45 million 56873 我需要的4个部分是 10万亿 8960亿 4500万 和 56873 我所做的是删除所有空格 然
  • 如何在 Android 中保存相机的临时照片?

    在尝试从相机拍照并将其保存到应用程序的缓存文件夹中时 我没有得到任何可见的结果 应用程序不会崩溃 但在 LogCat 上 当我尝试将 ImageView src 字段设置为刚刚获取的文件的 URI 时 我收到此消息 09 17 14 03
  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • 在包“android”中找不到属性“backgroundTint”的资源标识符

    我发现了一些视图 xml 属性 例如backgroundTint backgroundTintMode 但是当我使用它作为视图属性定义时 Eclipse 显示错误 No resource identifier found for attri
  • React Native 从 JavaScript 代码内部访问 strings.xml

    有没有办法访问当前值android app src main res values strings xml从 JavaScript 代码内部 我想为每个构建放置不同的端点 URL 但我什至无法检测到反应本机代码内的构建类型 而不必求助于 D
  • Android 30+ 中的视频捕获意图 - 只有所有者才能与待处理项目交互

    我正在尝试在我的应用程序上捕获视频 它可以在 android API 30 以下运行 但不能在 30 以上运行 似乎在 sdk 30 之后 android 不允许完全读取外部存储 作用域存储 我目前遇到这个错误 java lang Ille
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何使用phonegap在iOS应用程序中防止键盘推送webview

    当屏幕底部的输入字段获得焦点时 键盘会向上推我的网络视图 并且页面的上部不再可见 我想防止键盘推高网络视图 有人有主意吗 对焦 设置window scrollTo 0 0 这可以防止键盘完全推高 webview input on focus
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 原色(有时)变得透明

    我正在使用最新的 SDK 版本 API 21 和支持库 21 0 2 进行开发 并且在尝试实施新的材料设计指南时遇到了麻烦 材料设计说我需要有我的primary color and my accent color并将它们应用到我的应用程序上
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐

  • 华为OD机试真题B卷 Java 实现【字符串分隔】,附详细解题思路

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA 真题 A卷 B卷 刷的越多 抽
  • 如何使用Blender建3D汉字(保姆级别的详细)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于建模的学习笔记 本篇是如何使用Blender建3D汉字 这是这个专栏的第一篇 因为不知道把这篇放到哪里 就开了个新的 如何使用Blender建3D汉字 就这种的 如果是的话可以接着往下
  • 计算机科学和PYTHON编程导论_15_概率与分布

    随机程序 掷骰子 import random def rollDie 返回一个1 6的随机整数 return random choice 1 2 3 4 5 6 def rollN n result for i in range n res
  • Matlab回归分析

    线性回归 在实际中 对于情况较复杂的实际问题 因素不易化简 作用机理不详 可直接使用数据组建模 寻找简单的因果变量之间的数量关系 从而对未知的情形作预报 这样组建的模型为拟合模型 拟合模型的组建主要是处理好观测数据的误差 使用数学表达式从数
  • 用gdb.attach()在gdb下断点但没停下的情况及解决办法

    在python中 如果导入了pwntools 就可以使用里面的gdb attach io 的命令来下断点 但是这一次鼠鼠遇到了一个情况就是下了断点 但是仍然无法在断点处开始运行 奇奇怪怪 这是我的攻击脚本 我们运行一下 可以看到其实已经运行
  • Python入门--with语句

    with语句 上下文管理器 with语句可以自动管理上下文资源 不论什么原因跳出with块 都能确保文件的正确关闭 以此来达到释放资源的目的 with open 上下文管理器 with open a txt r as file as起个别名
  • Unity3d-游戏中的小地图制作

    方法一 利用NGJ MiniMap插件 1 导入该插件后 在Mesh Version gt Prefabs中 将NJG MiniMap 2D 拖入到场景中 2 在Hierarchy中点击MiniMap 位于NJG MiniMap 2D gt
  • inc si指令的作用_到底什么是链接,它起到了什么作用?

    几十年以前 计算机刚刚诞生 人们编写程序时 将所有的代码都写在同一个源文件中 经过长期的积累 程序包含了数百万行的代码 以至于人们无法维护这个程序了 于是人们开始寻找新的方法 迫切地希望将程序源代码分散到多个文件中 一个文件一个模块 以便更
  • 如何 debug (调试) maven 插件?

    用惯了 IntelliJ IDEA debug 功能 你知道如何在 IntelliJ IDEA 上调试 maven 插件吗 哈哈哈 那就是这篇文章准没错了 1 准备源码 准备你想要进行 debug 的 maven 插件的源代码 我这里以 m
  • ARM常用汇编指令

    目录 一 汇编基本语法 1 汇编指令的最典型书写模式 二 常用汇编指令 1 push压栈指令 2 pop出栈指令 3 sub指令 4 add指令 5 movs数据传输指令 6 str指令 7 ldr指令 8 bl指令 9 MOVW指令 10
  • C++不定参数,模板函数,模板类详解附实例

    前言 在 C 中 有时我们在写一个函数时并不知道参数的数量和类型 这时需要用到不定参数 模板函数 正文 不定参数 不定参数怎么表示 对于不定参数的表示 就是三个点 注意是英文的点 那么我们在正常使用时函数参数写成这样 funtionType
  • Python 容器序列切片

    视频版教程 Python3零基础7天入门实战视频教程 序列是指内容连续且有序的一类数据容器 前面学的列表 元组 字符串都是序列 并且支持下标索引 切片是指从一个序列中 取出一个子序列 语法 序列 起始下标 结束下标 步长 返回一个新的序列
  • 短文阅读3:Variational Autoencoders (VAEs)

    深度生成网络 VAEs introduction 降维方法 PCA and Autoencoders 降维架构 PCA 问题1 什么是自动编码器autoencoder PCA和Autoencoders之间的关系 Variational Au
  • 【建议收藏】数据库 SQL 入门——数据查询操作(内附演示)

    引言 在上一节中 我们讨论了DML的使用方法 本节我们继续开始DQL的学习 首先回归一下DQL的基于定义 DQL Data Query Language 数据查询语言 用来查询数据库中表的记录 在本节中我们主要讨论DQL的用法以及基本语法
  • 计算机视觉之人脸识别(Yale数据集)--HOG和ResNet两种方法实现

    1 问题描述 在给定Yale数据集上完成以下工作 在给定的人脸库中 通过算法完成人脸识别 算法需要做到能判断出测试的人脸是否属于给定的数据集 如果属于 需要判断出测试的人脸属于数据集中的哪一位 否则 需要声明测试的人脸不属于数据集 这是一个
  • 思维导图 函数

  • PCL点云处理之最小二乘空间直线拟合(3D) (二百零二)

    PCL点云处理之最小二乘空间直线拟合 3D 二百零二 一 算法简介 二 实现代码 三 效果展示 一 算法简介 对于空间中的这样一组点 大致呈直线分布 散乱分布在直线左右 我们可采用最小二乘方法拟合直线 更进一步地 可以通过点到直线的投影 最
  • 5款程序员必备的免费在线画图工具,超级好用!

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • java中的集合基础

    集合介绍 集合类的特点 提供一种存储空间可变的存储模型 存储的数据容量可以发生改变 集合和数组的区别 共同点 都是存储数据的容器 不同点 数组的容量是固定的 集合的容量是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型
  • 【Android进阶篇】WebView显示网页详解

    概述 WebView是Android用于显示网页的控件 通过WebView 我们可以查看本地的网页 也可以查看网络资源 本文内容如下 一 加载本地网页 二 加载网络资源 三 在WebView中使用JavaScript和CSS 四 WebCh