Android 带进度条WebView

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.结束。

转载于:https://my.oschina.net/huqiji/blog/864546

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值