欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中替换WebView加载网页失败时的页面

程序员文章站 2024-02-20 10:55:05
我们用webview去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示:   上面这个页面就是系统自带的页面,...

我们用webview去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示:

Android中替换WebView加载网页失败时的页面 

上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难看,于是乎小编就在想能不能自定义一个页面,当数据请求失败时让系统来加载我们自定义好的页面?上网查了很多资料,都没有关于这个问题的解决方法(反正我是没有找到),经过小编的不断琢磨,今天终于实现了这个功能。以下就是本人自定义实现的数据加载失败时的页面:

Android中替换WebView加载网页失败时的页面 

这样看起来是不是觉得很高大尚。这和我们真正拿到数据接口做出来的效果完全一样。对于用户来说这样的体验也是很完美的。

**全部代码:

一、主代码:**

mainactivity.java

package com.example.webview;
import android.support.v4.view.viewpager;
import android.support.v7.app.appcompatactivity;
import android.os.bundle;
import android.view.view;
import android.webkit.websettings;
import android.webkit.webview;
import android.webkit.webviewclient;
import android.widget.linearlayout;
import android.widget.relativelayout;
public class mainactivity extends appcompatactivity {
  private webview webview;
  private websettings mwebsettings;
  private view merrorview;
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    webview = (webview) findviewbyid(r.id.main_webview);
    setupview();
  }
  private void setupview() {
    //加载需要显示的网页
    webview.loadurl("http://www.baidu.com/");
    //设置webview属性,能够执行javascript脚本
    webview.getsettings().setjavascriptenabled(true);
    mwebsettings = webview.getsettings();
    mwebsettings.setjavascriptenabled(true);  //允许加载javascript
    mwebsettings.setsupportzoom(true);     //允许缩放
    mwebsettings.setbuiltinzoomcontrols(true); //原网页基础上缩放
    mwebsettings.setusewideviewport(true);   //任意比例缩放
    webview.setwebviewclient(webclient); //设置web视图
  }
  /***
   * 设置web视图的方法
   */
  webviewclient webclient = new webviewclient(){//处理网页加载失败时
    public void onreceivederror(webview view, int errorcode, string description, string failingurl) {
      showerrorpage();//显示错误页面
    };
  };
  boolean miserrorpage;
  protected void showerrorpage() {
    linearlayout webparentview = (linearlayout)webview.getparent();
    initerrorpage();//初始化自定义页面
    while (webparentview.getchildcount() > 1) {
      webparentview.removeviewat(0);
    }
    @suppresswarnings("deprecation")
    linearlayout.layoutparams lp = new linearlayout.layoutparams(viewpager.layoutparams.fill_parent, viewpager.layoutparams.fill_parent);
    webparentview.addview(merrorview, 0, lp);
    miserrorpage = true;
  }
  /****
   * 把系统自身请求失败时的网页隐藏
   */
  protected void hideerrorpage() {
    linearlayout webparentview = (linearlayout)webview.getparent();
    miserrorpage = false;
    while (webparentview.getchildcount() > 1) {
      webparentview.removeviewat(0);
    }
  }
  /***
   * 显示加载失败时自定义的网页
   */
  protected void initerrorpage() {
    if (merrorview == null) {
      merrorview = view.inflate(this, r.layout.activity_error, null);
      relativelayout layout = (relativelayout)merrorview.findviewbyid(r.id.online_error_btn_retry);
      layout.setonclicklistener(new view.onclicklistener() {
        public void onclick(view v) {
          webview.reload();
        }
      });
      merrorview.setonclicklistener(null);
    }
  }
}

二、xml布局代码:

1.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context="com.example.webview.mainactivity">
  <webview
    android:id="@+id/main_webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  </webview>
</linearlayout>

2.activity_error.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <relativelayout
    android:id="@+id/online_error_btn_retry"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e6e6e6"
    android:clickable="true"
    android:gravity="center" >
    <linearlayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:gravity="center"
      android:orientation="vertical"
      >
      <imageview
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:src="@drawable/wifi"
        android:id="@+id/imageview2" />
      <textview
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textsize="18dp"
        android:text="数据获取失败"
        ></textview>
      <textview
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textsize="15dp"
        android:text="请检查网络后,点击重新加载"
        />
    </linearlayout>
  </relativelayout>
</linearlayout>

以上所述是小编给大家介绍的android中替换webview加载网页失败时的页面,希望对大家有所帮助