Android webview使用大全

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);
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Android WebView的用法大全: 1. 在XML布局文件中添加WebView组件 ``` <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在Java代码中获取WebView组件并设置WebViewClient ``` WebView webView = findViewById(R.id.webview); webView.setWebViewClient(new WebViewClient()); ``` 3. 加载网页 ``` webView.loadUrl("https://www.example.com"); ``` 4. 后退和前进 ``` if(webView.canGoBack()) { webView.goBack(); } if(webView.canGoForward()) { webView.goForward(); } ``` 5. 加载本地HTML页面 ``` webView.loadUrl("file:///android_asset/index.html"); ``` 6. 设置JavaScript支持 ``` webView.getSettings().setJavaScriptEnabled(true); ``` 7. 设置缩放 ``` webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setDisplayZoomControls(false); ``` 8. 处理网页中的URL ``` webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.startsWith("mailto:")) { Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url)); startActivity(intent); return true; } view.loadUrl(url); return true; } }); ``` 9. 拦截网页中的请求 ``` webView.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { if(request.getUrl().toString().endsWith(".png")) { try { InputStream inputStream = getAssets().open("image.png"); return new WebResourceResponse("image/png", "UTF-8", inputStream); } catch (IOException e) { e.printStackTrace(); } } return super.shouldInterceptRequest(view, request); } }); ``` 10. 处理页面加载事件 ``` webView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { progressBar.setVisibility(View.VISIBLE); } @Override public void onPageFinished(WebView view, String url) { progressBar.setVisibility(View.GONE); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { Toast.makeText(MainActivity.this, "Error: " + error.getDescription(), Toast.LENGTH_SHORT).show(); } }); ``` 11. 调用JavaScript代码 ``` webView.loadUrl("javascript:alert('Hello, world!')"); ``` 12. 与JavaScript交互 ``` webView.addJavascriptInterface(new Object() { @JavascriptInterface public void showToast(String message) { Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); } }, "android"); ``` 以上是Android WebView的用法大全,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值