package com.zy.tour.util.widget;
import java.lang.reflect.Method;
import android.Manifest.permission;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebSettings.PluginState;
import android.webkit.WebSettings.RenderPriority;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import com.zy.tour.util.http.ProgressUtil;
/***
* WebView客户端:
* <p>
* 使用权限 {@link permission#INTERNET}
* <p>
* 提供以下功能:
* <ol>
* <li>设置浏览器是否可执行缩放 {@link LWebView#setZoomEnable(boolean)}
* <li>设置浏览器支持多窗口 {@link LWebView#setMultipleWindowsEnable(boolean)}
* <li>设置是否支持插件 {@link LWebView#setPluginState(PluginState)}
* <li>设置是否启动地理定位 {@link LWebView#setGeolocationEnabled(boolean)}
* <li>设置缓存模式 {@link LWebView#setCacheMode(int)}
* </ol>
* <p>
* 加载资源:
* <ol>
* <li>加载网络资源 : {@link WebView#loadUrl("http://www.google.com")}
* <li>加载本地assets文件夹下的资源 {@link
* WebView#loadUrl("file:///android_asset/index.html")}
* </ol>
*
* @author li'mingqi
*/
public class LWebView extends WebView {
/** 上下文对象 **/
private Context mContext;
/** WebView管理 */
private WebSettings mWebSetting;
/** 是否支持缩放--默认支持缩放 */
private boolean zoomEnable = true;
/** 是否支持多窗口--默认支持多窗口 */
private boolean multipleWindowsEnable = true;
/** 设置插件的支持与否状态 --默认不支持插件 */
private PluginState pluginState = PluginState.OFF;
/** 是否启用地理定位 --默认开启 **/
private boolean GeolocationEnabled = true;
/** 是否弹出正在加载的progressDialog,默认弹出 **/
private boolean show = true;
/**
* 设置缓存模式 --默认正常缓存模式--
* <ol>
* <li>{@link WebSettings#LOAD_NORMAL} ,正常使用缓存
* <li>{@link WebSettings#LOAD_NO_CACHE} ,不使用缓存
* <li>{@link WebSettings#LOAD_CACHE_ELSE_NETWORK} ,高速缓存模式,若高速缓存中无数据,则执行网络加载
* <li>{@link WebSettings#LOAD_CACHE_ONLY} ,不使用网络加载,只从缓存中取
* <li>{@link WebSettings#LOAD_DEFAULT} ,默认的缓存模式,即当缓存资源可用时,使用缓存,不可用时从网络加载.
* </ol>
**/
private int cacheMode = 0;
private ProgressUtil progress = null;
public LWebView(Context context) {
super(context);
init(context);
}
public LWebView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public LWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
@SuppressWarnings("deprecation")
@SuppressLint("SetJavaScriptEnabled")
private void init(Context context) {
this.mContext = context;
progress = new ProgressUtil(mContext);
/***
* 触摸焦点起作用
*/
requestFocusFromTouch();
/***
* 滚动条样式在视图的边缘显示滚动条,
*/
setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
mWebSetting = getSettings();
/***
* 设置浏览器执行jsp
*/
mWebSetting.setJavaScriptEnabled(true);
/***
* 设置webView是否支持缩放,默认支持;
*/
mWebSetting.setSupportZoom(zoomEnable);
/***
* 设置支持多窗口,默认支持
*/
mWebSetting.setSupportMultipleWindows(multipleWindowsEnable);
/***
* 设置浏览器是否支持插件
*/
mWebSetting.setPluginState(pluginState);
/***
* 设置是否支持地理定位
*/
mWebSetting.setGeolocationEnabled(GeolocationEnabled);
/***
* 设置编码解码HTML时的编码方式
*/
mWebSetting.setDefaultTextEncodingName("UTF-8");
/**
* 设置缓存模式
*/
mWebSetting.setCacheMode(cacheMode);
/***
* 设置渲染优先级--过时,高版本不再给予支持
*/
mWebSetting.setRenderPriority(RenderPriority.HIGH);
/***
* 设置可以加载本地的文件,资源文件可是使用 "///android_asset","///android_res"
*/
mWebSetting.setAllowFileAccess(true);
/***
* 加载网页中的图片---默认为true
*/
mWebSetting.setLoadsImagesAutomatically(true);
/**
* 开启应用程序缓存 --必须制定应用缓存目录才能生效 即
* {@link WebSettings#setAppCachePath(String)}
*/
mWebSetting.setAppCacheEnabled(true);
/***
* 设置可以使用DOM存储
*/
mWebSetting.setDomStorageEnabled(true);
/**
* 获取应用缓存路径
*/
String appCachePath = context.getApplicationContext().getCacheDir()
.getAbsolutePath();
/***
* 设置webView的缓存路径
*/
mWebSetting.setAppCachePath(appCachePath);
/***
* 加载url监听事件
*/
setWebViewClientListener();
}
/**
* 设置是否弹出正在加载的progressDialog
*
* @param show
* the show to set
*/
public void setShow(boolean show) {
this.show = show;
}
/***
* 加载监听
*/
public void setWebViewClientListener() {
setWebViewClient(new WebViewClient() {
/***
* 拦截url,并使用该浏览器处理该url
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("tel:")) {// 打电话
Intent intent = new Intent(Intent.ACTION_CALL,
Uri.parse(url));
mContext.startActivity(intent);
} else if (url.startsWith("sms:")) {// 发短息
Uri uri = Uri.parse("smsto:" + url.split(":")[1]);
Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri);
sendIntent.putExtra("sms_body", "");
mContext.startActivity(sendIntent);
} else {// 正常处理url
view.loadUrl(url);
}
return true;
}
/***
* 异常
*/
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
Toast.makeText(mContext, description + "\n" + failingUrl,
Toast.LENGTH_LONG).show();
}
/***
* 开始加载
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if(show){
progress.show("正在加载数据...");
}
}
/***
* 加载 结束
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if(progress.isShowing()){
progress.dismiss();
}
}
});
}
/***
* 监听系统手机的返回键
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (canGoBack() && keyCode == KeyEvent.KEYCODE_BACK) {
goBack();// 返回上一个页面,而不是finish调该页面
return true;
}
return false;
}
@Override
public void destroy() {
try {
Class<?> localClass = super.getClass();
Method localMethod = localClass.getMethod("freeMemory",
new Class[0]);
localMethod.invoke(this, new Object[0]);
super.destroy();
return;
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 设置webView是否支持缩放
*
* @param zoomEnable
* 是否支持缩放
*/
public void setZoomEnable(boolean zoomEnable) {
this.zoomEnable = zoomEnable;
}
/***
* 设置是否支持多窗口
*
* @param multipleWindowsEnable
* 是否支持
*/
public void setMultipleWindowsEnable(boolean multipleWindowsEnable) {
this.multipleWindowsEnable = multipleWindowsEnable;
}
/***
* 设置插件的支持状态
*
* @param pliginState
* 插件状态打开与否
*/
public void setPluginState(PluginState pliginState) {
this.pluginState = pliginState;
}
/***
* 设置是否开启地理定位
*
* @param geolocationEnabled
* 是否定位
*/
public void setGeolocationEnabled(boolean geolocationEnabled) {
GeolocationEnabled = geolocationEnabled;
}
/***
* 设置缓存模式
*
* @param cacheMode
* 缓存模式
*/
public void setCacheMode(int cacheMode) {
this.cacheMode = cacheMode;
}
interface WebLoadJavaScriptListener {
void service(String... action);
}
}
Android webview使用大全
最新推荐文章于 2024-03-18 19:59:21 发布