Android WebView加載網頁進度監聽

首先是佈局R.layout.activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.sportsii.webviewdemo.MainActivity">

    <LinearLayout
        android:id="@+id/webView_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:progressDrawable="@drawable/progressbar_carch" />

        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></WebView>
    </LinearLayout>

    <TextView
        android:id="@+id/error_tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="網絡連接錯誤"
        android:textSize="30dp"
        android:visibility="gone" />

</RelativeLayout>

然後是 ProgressBar樣式

<?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>
            <corners android:radius="2.0dip" />

            <gradient
                android:angle="270.0"
                android:centerColor="#FFFFFF"
                android:centerY="2.0"
                android:endColor="#FFFFFF"
                android:startColor="#FFFFFF" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="2.0dip" />

                <gradient
                    android:angle="270.0"
                    android:centerColor="#8bc34a"
                    android:centerY="2.0"
                    android:endColor="#8bc34a"
                    android:startColor="#8bc34a" />
            </shape>
        </clip>
    </item>

</layer-list>
最後是邏輯代碼(如果加載失敗會顯示加載失敗的界面)

package com.example.sportsii.webviewdemo;

import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private LinearLayout webLLayout;
    private TextView errorTv;
    private WebView webView;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        webLLayout = (LinearLayout) findViewById(R.id.webView_layout);
        errorTv = (TextView) findViewById(R.id.error_tv);
        initViews();
    }

    private void initViews() {//支持javascript
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);// 支持通過JS打開新窗口
        // 設置可以支持縮放
        webView.getSettings().setSupportZoom(true);
        // 設置出現縮放工具
        webView.getSettings().setBuiltInZoomControls(true);
        //擴大比例的縮放
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setAllowFileAccess(true);
        webView.getSettings().setLoadsImagesAutomatically(true);// 支持自動加載圖片
        //自適應屏幕
        webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        webView.getSettings().setLoadWithOverviewMode(true);

        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                progressBar.setProgress(newProgress);
            }
        });
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                progressBar.setVisibility(View.VISIBLE);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                progressBar.setVisibility(View.GONE);
            }

            //請求失敗時顯示失敗的界面
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                webLLayout.setVisibility(View.GONE);
                errorTv.setVisibility(View.VISIBLE);
            }
        });
        webView.loadUrl(" http://blog.csdn.net/mchenys/article/details/49930739");
    }

    // 改寫手機物理按鍵--返回的邏輯
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {

            if (webView.canGoBack()) {
                webView.goBack();// 返回上一頁面
                return true;
            } else {
                finish();
                // System.exit(0);// 退出程序
            }
        }
        return super.onKeyDown(keyCode, event);
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章