简易的 WebView 拦截事件等
来源:互联网 发布:shell 中执行 python 编辑:程序博客网 时间:2024/06/06 02:43
WebView 是一个视图小部件,在应用程序中,它可以嵌入到任何布局中来显示本地或远程的网页内容。WebView 基于开源的 WebKit 引擎。WebView 非常适合处理大图片。
应用程序使用 WebView 显示内容时,可以在点击页面中的链接时设置需要的监听和响应。
实现一个 WebViewClient 并把它关联到 WebView 上。在默认情况下,如果没有指定 WebViewClient ,那么 WebView 会将一个 URL 传递给 ActivityManager处理。其中:shouldOverrideUrlLoading() 默认返回 false。
效果如下:
拦截 WebView URL 的 Activity
MainActivity.java :
package com.crazy.webnet;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.text.TextUtils;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WebView webView = new WebView(this); // 启用 JavaScript 支持 webView.getSettings().setJavaScriptEnabled(true); // 添加一个客户端到视图上 // 让 WebView 自己处理所有的 URL 请求 webView.setWebViewClient(mClient); // 如果仅仅只是加载页面,如下即可(不需要 WebViewClient 的对象): // webView.setWebViewClient(new WebViewClient()); webView.loadUrl("http://www.baidu.com"); setContentView(webView); } private WebViewClient mClient = new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Uri request = Uri.parse(url); if (TextUtils.equals(request.getAuthority(), "www.baidu.com")) { // 允许加载( shouldOverrideUrlLoading()方法默认返回 false) // 官网注释:This is my web site, so do not override; let my WebView load the page return false; } // 如果注释掉下面 Intent 的相关内容,则可以拦截 WebView URL,不会加载页面 // Toast.makeText(MainActivity.this, "请换个网站", Toast.LENGTH_SHORT).show(); // 连接不是在本页面上,而是重新启动一个界面来显示 Intent intent =new Intent(Intent.ACTION_VIEW, request); startActivity(intent); return true; } };}
</pre><p></p><p></p><p>补充:</p><p>对于加载本地的资源:</p><p></p><pre code_snippet_id="1905367" snippet_file_name="blog_20160928_3_9655744" name="code" class="java"> // 加载本地资源 webView.loadUrl("file:///android_asset/example.html");
对于其中的 setWebViewClient() 方法可以如下理解:
//覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开 webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器 view.loadUrl(url); return true; } });
判断网络加载过程 ( setWebChromeClient() 方法和 setWebClient() 方法的区别:):
/** * 判断页面加载过程; * 其中方法 setWebChromeClient():辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等; * 而方法 setWebClient():主要处理解析,渲染网页等浏览器做的事情 */ webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { // 最大进度 100,所以当为 100 就是网页加载完成之时 if (newProgress == 100) { // 网页加载完成 Toast.makeText(DistanceActivity.this, "OK!", Toast.LENGTH_SHORT).show(); } else { // 加载中 Toast.makeText(DistanceActivity.this, "网页加载中!", Toast.LENGTH_SHORT).show(); } } });可以在其中加上 ProgressBar 等显示进度的控件,模拟加载过程。
加载好网页后,对于返回键的点击,当想点击退回之前浏览的网页,而不是想点击后直接退出应用,则可以如下操作:
/** * 改写物理按键——返回的逻辑 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { if(webView.canGoBack()) { webView.goBack();//返回上一页面 return true; } else { Toast.makeText(DistanceActivity.this, "正在退出应用!", Toast.LENGTH_SHORT).show(); // 如果没有设置 启用支持javascript 则需要按返回键很多次才能退出程序 System.exit(0);//退出程序 } } return super.onKeyDown(keyCode, event); }
在 AndroidManifest.xml 中注册:
<uses-permission android:name="android.permission.INTERNET"/>
0 0
- 简易的 WebView 拦截事件等
- 如何在Fragment中拦截webview的返回事件
- OnMouseDown 等鼠标事件Android Webview 的事件处理
- WebView的拦截设置
- android webview点击拦截事件处理判断
- ScrollView内嵌套 WebView WebView 拦截滚动事件问题
- 关于WebView的简易封装
- Android的WebView拦截数据
- WebView拦截点击的url
- Android中WebView点击事件的拦截跳转到原生的界面
- Android中WebView点击事件的拦截跳转到原生的界面
- webView的onScrollchanged事件
- onkeydown事件的拦截
- 奇怪的事件拦截
- IOS Webview JS交互之事件拦截获取
- Android中监听Phonegap的webview的start,finish等事件
- Android程序:简易浏览器的实现(WebView)
- 简易的按钮事件----Button事件处理
- QQl聊天消息
- Codeforces Round #302 (Div. 2) A. Set of Strings
- 如何在Linux中查看所有正在运行的进程
- 本地广播LocalBroadcastManager的好处
- servlet容器的URL映射知识
- 简易的 WebView 拦截事件等
- 创建用户报错ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
- 北大OJ1001
- mysql参数调优
- Windows程序设计--创建第一个窗口
- ubuntu QQ
- 扫雷2
- OC语言 OC初识-类与对象
- PAT 1023 组个最小数