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

Android 实现无网络页面切换的示例代码

程序员文章站 2023-12-19 10:40:04
本文介绍了android 实现无网络页面切换的示例代码,分享给大家,具体如下: 实现思路 需求是在无网络的时候显示特定的页面,想到要替换页面的地方,大多...

本文介绍了android 实现无网络页面切换的示例代码,分享给大家,具体如下:

Android 实现无网络页面切换的示例代码

Android 实现无网络页面切换的示例代码

实现思路

需求是在无网络的时候显示特定的页面,想到要替换页面的地方,大多都是recyclerview或者第三方recyclerview这种需要显示数据的地方,因此决定替换掉页面中所有的recyclerview为无网络页面

实现过程

1 在baseactivity中,当加载布局成功以后,通过id找到要替换的view,通过indexofchild()方法,找到要替换的view的位置,再通过remove和add view来实现,因为是在base替换,而且使用的是findviewbyid,这样子就省去了考虑fragment中的view,局限性是要替换的view的命名必须要统一

2 点击按钮重新请求数据,需要重新刷新数据,因此使用了无网络页面的act需要重写base的刷新数据方法,去重新请求数据。

优缺点

因为只在base中替换,因此要替换的view,id名需要一致,对比通过decorview拿到content之后遍历所有控件获取到要替换的view的方法效率更高,而且省去了考虑fragment的情况,通过findviewbyid()方法可以直接获取到fragment中需要替换的recyclerview。

代码实现

在加载布局成功初始化无网络页面

 @override
  public void onwindowfocuschanged(boolean hasfocus) {
    super.onwindowfocuschanged(hasfocus);
    if (hasfocus) {
      initnonetview(r.id.id_xrv,r.id.rv);
    }
  }

需要一个工具类用来获取网络状态

/**
   * 判断网络是否连接
   *
   * @param context
   * @return
   */
  public static boolean isconnected(context context) {

    connectivitymanager connectivity = (connectivitymanager) context
        .getsystemservice(context.connectivity_service);

    if (null != connectivity) {

      networkinfo info = connectivity.getactivenetworkinfo();
      if (null != info && info.isconnected()) {
        if (info.getstate() == networkinfo.state.connected) {
          return true;
        }
      }
    }
    return false;
  }

初始化无网络页面,定义一个不定长的view的id组成的数组,参数为需要替换的view的共同的id,可以为多个,会替换第一个找到的不为null的view。

private void initnonetview(int ...ids) {
    if (!okhttputil.isconnected(baseactivity.this) && !haveshownetview) {
      final list<view> viewlist = new arraylist<>();
      //通过id获取view
      for (int id : ids) {
        viewlist.add(findviewbyid(id));
      }
      //实现自己的无网络页面
      final view nonetview = view.inflate(baseactivity.this, r.layout.layout_no_net, null);
      nonetview.findviewbyid(r.id.btn_try).setonclicklistener(new view.onclicklistener() {
        @override
        public void onclick(view v) {
          if (!okhttputil.isconnected(baseactivity.this)) {
            t.showshort(baseactivity.this, "没有获取到网络,请重试...");
            return;
          }
          //切换到有网络页面
          showhavenetview(viewlist,nonetview);

        }
      });
      //切换到无网络页面
      shownonetview(viewlist,nonetview);
      

    }
  }

页面切换

private void showhavenetview(list<view> viewlist, view nonetview) {
    for (view view : viewlist) {
      if (view==null){
        continue;
      }
      haveshownetview = false;
      transview(nonetview, view);
      onrenetrefreshdata();
      break;
    }
  }

  private void shownonetview(list<view> viewlist, view nonetview) {
    for (view view : viewlist) {
      if (view==null){
        continue;
      }
      haveshownetview = true;
      transview(view, nonetview);
      break;
    }
  }

protected void transview(final view defaultview, view replaceview) {
    final int index = ((viewgroup) defaultview.getparent()).indexofchild(defaultview);
    viewgroup.layoutparams params = defaultview.getlayoutparams();
    viewgroup parent = (viewgroup) defaultview.getparent();
    parent.removeview(defaultview);
    parent.addview(replaceview, index, params);
  }

点击按钮显示有网络页面的时候通知页面更新数据,baseact为空实现,需要更新数据的页面重写onrenetrefreshdata()方法。

public void onrenetrefreshdata() {

 }

整体代码

 private boolean haveshownetview = false;

  @override
  public void onwindowfocuschanged(boolean hasfocus) {
    super.onwindowfocuschanged(hasfocus);
    if (hasfocus) {
      initnonetview(r.id.id_xrv,r.id.rv);
    }
  }


  private void initnonetview(int ...ids) {
    if (!okhttputil.isconnected(baseactivity.this) && !haveshownetview) {
      final list<view> viewlist = new arraylist<>();
      //通过id获取view
      for (int id : ids) {
        viewlist.add(findviewbyid(id));
      }
      //实现自己的无网络页面
      final view nonetview = view.inflate(baseactivity.this, r.layout.layout_no_net, null);
      nonetview.findviewbyid(r.id.btn_try).setonclicklistener(new view.onclicklistener() {
        @override
        public void onclick(view v) {
          if (!okhttputil.isconnected(baseactivity.this)) {
            t.showshort(baseactivity.this, "没有获取到网络,请重试...");
            return;
          }
          //切换到有网络页面
          showhavenetview(viewlist,nonetview);

        }
      });
      //切换到无网络页面
      shownonetview(viewlist,nonetview);
      

    }
  }

  private void showhavenetview(list<view> viewlist, view nonetview) {
    for (view view : viewlist) {
      if (view==null){
        continue;
      }
      haveshownetview = false;
      transview(nonetview, view);
      onrenetrefreshdata();
      break;
    }
  }

  private void shownonetview(list<view> viewlist, view nonetview) {
    for (view view : viewlist) {
      if (view==null){
        continue;
      }
      haveshownetview = true;
      transview(view, nonetview);
      break;
    }
  }

  public void onrenetrefreshdata() {

  }

  protected void transview(final view defaultview, view replaceview) {
    final int index = ((viewgroup) defaultview.getparent()).indexofchild(defaultview);
    viewgroup.layoutparams params = defaultview.getlayoutparams();
    viewgroup parent = (viewgroup) defaultview.getparent();
    parent.removeview(defaultview);
    parent.addview(replaceview, index, params);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: