您的位置:首页 > 移动开发

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

2015-09-25 16:34 811 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息