Android使用WebView, WebChromeClient和WebViewClient加载网页

package com.lei.chenmei;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.net.URL;

/**
 * Created by renlei
 * DATE: 15-9-25
 * Time: 下午3:04
 * Email: renlei0109@yeah.net
 */
public class WebViewTestActivity extends Activity {
    private WebView webView;
    private String mUrl;
    private String mTitle;
    private View rootView;
    private TextView titleTV;
    private ProgressBar progressBar;
    public static final String WEB_URL = "web_url";
    public static final String TITLE = "title";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        rootView = View.inflate(this, R.layout.webviewtest, null);
        setContentView(rootView);
        getData();
        initWebView();
    }

    /**
     * 获取数据
     */
    private void getData() {
        Intent intent = getIntent();
        if (intent != null) {
            if (intent.getStringExtra(WEB_URL) != null && intent.getStringExtra(TITLE) != null) {
                mUrl = intent.getStringExtra(WEB_URL);
                mTitle = intent.getStringExtra(TITLE);
            }
        }
    }

    /**
     * 初始化webview
     */
    private void initWebView() {
        Log.d("renlei", "initWebView");

        webView = (WebView) rootView.findViewById(R.id.web_view);
        progressBar = (ProgressBar) rootView.findViewById(R.id.progressbar);
        titleTV = (TextView) rootView.findViewById(R.id.title);
        webView.setWebViewClient(new MyWebViewClient());
        webView.setWebChromeClient(new MyWebChromeClient());
        if (mUrl != null) {
            Log.d("renlei", "initWebView" + "  webView.loadUrl(mUrl)  " + mUrl);
            webView.loadUrl(mUrl);
        }
        webView.requestFocusFromTouch();//如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。


        //打开页面时, 自适应屏幕:
        WebSettings webSettings = webView.getSettings();
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        //支持javascript
        webSettings.setJavaScriptEnabled(true);
        //便页面支持缩放:
        webSettings.setBuiltInZoomControls(true);
        webSettings.setSupportZoom(true);

        /**
         * setJavaScriptEnabled(true);  //支持js

         setPluginsEnabled(true);  //支持插件

         setUseWideViewPort(false);  //将图片调整到适合webview的大小

         setSupportZoom(true);  //支持缩放

         setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局

         supportMultipleWindows();  //多窗口

         setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  //关闭webview中缓存

         setAllowFileAccess(true);  //设置可以访问文件

         setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点

         webview webSettings.setBuiltInZoomControls(true); //设置支持缩放

         setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口

         setLoadWithOverviewMode(true); // 缩放至屏幕的大小

         setLoadsImagesAutomatically(true);  //支持自动加载图片
         */
    }

    /**
     * 监测返回键
     *
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (webView.canGoBack()) {
                webView.goBack();
                Log.d("renlei", "webview goback");
            } else {
                // 按返回的时候, 先关闭可能打开的软键盘, 再返回上一页
                InputMethodManager imm = (InputMethodManager) (getSystemService(Context.INPUT_METHOD_SERVICE));
                imm.hideSoftInputFromWindow(webView.getWindowToken(), 0);
                WebViewTestActivity.this.finish();
            }
            return true;
        }
        return false;
    }

    /**
     * MyWebViewClient 中各方法的作用
     * <p/>
     * doUpdateVisitedHistory(WebView view, String url, boolean isReload)  //(更新历史记录)
     * <p/>
     * onFormResubmission(WebView view, Message dontResend, Message resend) //(应用程序重新请求网页数据)
     * <p/>
     * onLoadResource(WebView view, String url) // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
     * <p/>
     * onPageStarted(WebView view, String url, Bitmap favicon) //这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
     * <p/>
     * onPageFinished(WebView view, String url) //在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。
     * <p/>
     * onReceivedError(WebView view, int errorCode, String description, String failingUrl)// (报告错误信息)
     * <p/>
     * onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)//(获取返回信息授权请求)
     * <p/>
     * onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重写此方法可以让webview处理https请求。
     * <p/>
     * onScaleChanged(WebView view, float oldScale, float newScale) // (WebView发生改变时调用)
     * <p/>
     * onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加载时调用)
     * <p/>
     * shouldOverrideKeyEvent(WebView view, KeyEvent event)//重写此方法才能够处理在浏览器中的按键事件。
     * <p/>
     * shouldOverrideUrlLoading(WebView view, String url)
     * //在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
     */

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.d("renlei", "shouldOverrideUrlLoading" + url);
            /**
             *真正是在这里进行加载的
             */
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.v("renlei", "onPageStarted(), url:" + url);
            progressBar.setVisibility(View.VISIBLE);
        }
    }

    private class MyWebChromeClient extends WebChromeClient {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
            Log.d("renlei", "onProgressChanged" + newProgress);
            progressBar.setProgress(newProgress);
            if (newProgress == 100) {
                progressBar.setVisibility(View.GONE);
            }
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            if (title != null) {
                titleTV.setText(title);
                Log.d("renlei", "onReceivedTitle" + title);
            }
        }
    }

}

布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
        >
        <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="50dp"
                >
            <TextView
                    android:id="@+id/title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="title"
                    android:textSize="20sp"
                    android:layout_centerVertical="true"
                    android:layout_centerInParent="true"/>
        </RelativeLayout>
    <ProgressBar
            android:id="@+id/progressbar"
            android:layout_width="fill_parent"
            android:layout_height="5dp"
            style="?android:attr/progressBarStyleHorizontal"/>
    <WebView
            android:id="@+id/web_view"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"></WebView>
</LinearLayout>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值