简易的 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
原创粉丝点击