安卓开发中实现替换webview加载网页失败时的页面和失败后点击后重新加载

时间:2021-06-24 13:44:07

项目需要在此记录!

Activity中的代码:

public class MainActivity extends AppCompatActivity {

    private WebView webView;
    private View mErrorView;
    private RelativeLayout loading_over;
    private String url = "http://www.baidu.com/ ";
    private RelativeLayout webParentView;
    private boolean isSuccess = false;
    private boolean isError = false;
    private LinearLayout ll_control_error;
    private RelativeLayout error;
    private String mobile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView);
        loading_over = (RelativeLayout) findViewById(R.id.loading_over);
        ll_control_error = (LinearLayout) findViewById(R.id.ll_control_error);
        RelativeLayout error = (RelativeLayout) ll_control_error.findViewById(R.id.online_error_btn_retry);
        error.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ll_control_error.setVisibility(View.GONE);
                loading_over.setVisibility(View.VISIBLE);
                webView.reload();
            }
        });
        setUpView();

    }

    /** * 设置webview参数 */
    private void setUpView() {
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);//设置支持js
        settings.setDomStorageEnabled(true); //加此行即可出来地图
        webView.loadUrl(url);
        // 此方法可以处理webview 在加载时和加载完成时一些操作
        webView.setWebViewClient(webClient);  //设置Web视图
    }

    /*** * 设置Web视图的方法 */
    WebViewClient webClient = new WebViewClient() {//处理网页加载失败时

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            isError = true;
            isSuccess = false;
            //6.0以上执行
            webView.setVisibility(View.GONE);
            ll_control_error.setVisibility(View.VISIBLE);
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            isError = true;
            isSuccess = false;
            //6.0以下执行
            webView.setVisibility(View.GONE);
            ll_control_error.setVisibility(View.VISIBLE);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if (!isError) {
                isSuccess = true;
                //回调成功后的相关操作
                loading_over.setVisibility(View.GONE);
                ll_control_error.setVisibility(View.GONE);
                webView.setVisibility(View.VISIBLE);
            } else {
                isError = false;
                loading_over.setVisibility(View.GONE);
                ll_control_error.setVisibility(View.VISIBLE);
            }

        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.contains("tel")) {
                mobile = url.substring(url.lastIndexOf("/") + 1);
                //检测权限
                checkPerm();
                //这个超连接,java已经处理了,webview不要处理了
                return true;
            }
            return super.shouldOverrideUrlLoading(view, url);
        }
    };

    /** * 检测电话权限 */
    private void checkPerm() {
        MPermissions.requestPermissions(MainActivity.this, 6, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        MPermissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @PermissionGrant(6)
    public void requestSdcardSuccess() {
        Uri uri = Uri.parse("tel:" + mobile);
        Intent intent = new Intent(Intent.ACTION_CALL, uri);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            // ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            // public void onRequestPermissionsResult(int requestCode, String[] permissions,
            // int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        startActivity(intent);
    }

    @PermissionDenied(6)
    public void requestSdcardFailed()
    {

    }
    /** * 重置返回键 * @param keyCode * @param event * @return */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK&&webView.canGoBack()){
            webView.goBack();
            return true;
        }
        return false;
    }

}

activity_main里的代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ddd" >
    <WebView  android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />
    <include layout="@layout/activity_url_error"/>
    <RelativeLayout  android:id="@+id/loading_over" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#E6E6E6" android:gravity="center" >

        <!--<ImageView-->
            <!--android:layout_width="100dp"-->
            <!--android:layout_height="100dp"-->
            <!--android:layout_above="@+id/loading"-->
            <!--android:layout_centerInParent="true"-->
            <!--android:layout_marginTop="3dip"-->
            <!--android:padding="10dip"-->
            <!--android:src="@drawable/ic_launcher" />-->

        <com.zk.projecthelp.LoadingImageView  android:id="@+id/loading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" />

        <TextView  android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/loading" android:layout_centerInParent="true" android:layout_marginTop="5dp" android:text="正在获取数据..." android:textColor="#737373" />
    </RelativeLayout>

</RelativeLayout>

activity_url_error里的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll_control_error" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

    <RelativeLayout  android:id="@+id/online_error_btn_retry" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:background="#ddd" android:gravity="center" >

        <ImageView  android:id="@+id/img_error" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/loading" android:layout_centerInParent="true" android:layout_marginTop="3dip" android:padding="10dip" android:src="@mipmap/kong" />

        <TextView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/img_error" android:layout_centerInParent="true" android:layout_marginTop="3dip" android:gravity="center" android:text="好像没网哦!\n检测网络设置后,戳我重试!" android:textColor="#737373" />
    </RelativeLayout>

</LinearLayout>

自定义的LoadingImageView:

public class LoadingImageView extends ImageView {
    private AnimationDrawable mAnimationDrawable;


    public LoadingImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setBackgroundResource(R.drawable.loading);
        mAnimationDrawable = (AnimationDrawable) getBackground();
        mAnimationDrawable.start();
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {

        super.onVisibilityChanged(changedView, visibility);
        if (visibility == View.GONE) {
            mAnimationDrawable.stop();
        }
    }
}

网上的资料基本没实现失败后点击后重新加载!我这个应该是最简单的实现方法之一了!