1.自定义WebView WebViewWithProgress.java
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import com.R;
/**
* Created by czf 带进度条WebView
*/
@SuppressLint("SetJavaScriptEnabled")
public class WebViewWithProgress extends WebView {
private ProgressBar mProgressBar;
private OnTitleReadyListener mOnTitleReadyListener;
public WebViewWithProgress(Context context) {
this(context.getApplicationContext(), null);//此处防止内存泄露,不可用context
}
public WebViewWithProgress(Context context, AttributeSet attrs) {
this(context.getApplicationContext(), attrs, android.R.attr.webViewStyle);//此处防止内存泄露,不可用context
}
public WebViewWithProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context.getApplicationContext(), attrs, defStyleAttr);//此处防止内存泄露,不可用context
init();
}
@SuppressLint({"AddJavascriptInterface", "SetJavaScriptEnabled"})
@SuppressWarnings("ALL")
private void init() {
mProgressBar = new ProgressBar(getContext(), null, android.R.attr.progressBarStyleHorizontal);
LayoutParams params = new LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 6, 0, 0
);
mProgressBar.setLayoutParams(params);
Drawable drawable = getResources().getDrawable(R.drawable.progress_bar_horizontal_states);
mProgressBar.setProgressDrawable(drawable);
addView(mProgressBar);
setWebChromeClient(new WebClient());
// setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
/**
// 启用javascript
getSettings().setJavaScriptEnabled(true);
getSettings().setUseWideViewPort(true);
//是否可以缩放
getSettings().setSupportZoom(true);
getSettings().setBuiltInZoomControls(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
getSettings().setDisplayZoomControls(false);
}
**/
WebSettings webSettings = this.getSettings();
webSettings.setUseWideViewPort(true);
webSettings.setJavaScriptEnabled(true);
// 设置可以访问文件
webSettings.setAllowFileAccess(true);
// 设置可以支持缩放
webSettings.setSupportZoom(false);
// 设置默认缩放方式尺寸是far
webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
// 设置出现缩放工具
webSettings.setBuiltInZoomControls(false);
//webSettings.setDefaultFontSize(10);
webSettings.setDomStorageEnabled(true);
webSettings.setAppCacheEnabled(true);
this.setWebViewClient(new webViewClient());
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
LayoutParams lp = (LayoutParams) mProgressBar.getLayoutParams();
lp.x = l;
lp.y = t;
mProgressBar.setLayoutParams(lp);
super.onScrollChanged(l, t, oldl, oldt);
}
public class WebClient extends WebChromeClient {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (mOnTitleReadyListener != null) {
mOnTitleReadyListener.onTitleReady(title);
}
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
mProgressBar.setVisibility(GONE);
} else {
if (mProgressBar.getVisibility() == GONE) {
mProgressBar.setVisibility(VISIBLE);
}
mProgressBar.setProgress(newProgress);
}
super.onProgressChanged(view, newProgress);
}
}
public interface OnTitleReadyListener {
void onTitleReady(String title);
}
public void setOnTitleReadyListener(OnTitleReadyListener onTitleReadyListener) {
mOnTitleReadyListener = onTitleReadyListener;
}
class webViewClient extends WebViewClient {
//重写shouldOverrideUrlLoading方法,使点击链接后不使用其他的浏览器打开。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
//如果不需要其他对点击链接事件的处理返回true,否则返回false
return true;
}
}
}
2.资源文件。progress_bar_horizontal_states.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<gradient
android:startColor="#ECECEC"
android:centerColor="#F4F4F4"
android:endColor="#FFFFFF"
/>
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<gradient
android:startColor="#489eff"
android:centerColor="#489eff"
android:endColor="#489eff"
/>
</shape>
</clip>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<gradient
android:centerColor="#40000000"
android:endColor="#44000000"
android:startColor="#33000001"
/>
</shape>
</clip>
</item>
</layer-list>
3.调用。
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.ViewGroup;
import com.*.R;
import com.*.base.TopBaseActivity;
import com.*.Constant;
import com.*.UserData;
import com.*.WebViewWithProgress;
/*机场客流统计*/
public class AirportStatisticsActivity extends TopBaseActivity implements
WebViewWithProgress.OnTitleReadyListener{
private WebViewWithProgress mWebView;
private String urlToLoad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_airport_statistics);
this.bindView();
this.setTopView(R.string.airport_statistics_title , 0 , true);
this.dataInit();
this.viewInit();
}
private void dataInit(){
if (UserData.getAccessType() == UserData.INTRANET) {
urlToLoad = Constant.CASE_AUDIT_URL_LAN + "/Resources/AirPort/index.html";
} else {
urlToLoad = Constant.CASE_AUDIT_URL + "/Resources/AirPort/index.html";
}
}
private void viewInit(){
mWebView = (WebViewWithProgress) this.findViewById(R.id.web_view);
mWebView.setOnTitleReadyListener(this);
mWebView.requestFocusFromTouch();
this.updateData();
}
@Override
public void onTitleReady(String title) {
super.setTopView(title);
}
public void updateData() {
if (!TextUtils.isEmpty(urlToLoad)) {
mWebView.loadUrl(urlToLoad);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//销毁webview
if (mWebView != null) {
mWebView.clearHistory();
mWebView.clearCache(true);
mWebView.freeMemory();
mWebView.pauseTimers();
ViewGroup parent = (ViewGroup) mWebView.getParent();
if (parent != null) {
parent.removeView(mWebView);
}
mWebView.removeAllViews();
mWebView.destroy();
mWebView = null;
}
}
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
backOrFinish();
return true;
}
return super.dispatchKeyEvent(event);
}
@Override
protected void onBackClick() {
backOrFinish();
}
/*关闭或者后退*/
private void backOrFinish(){
if (urlToLoad.equals(mWebView.getUrl())){
this.finish();
}else{
mWebView.goBack();
}
}
}
4.结束。