简易的 WebView 拦截事件等

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值