当前位置: 移动技术网 > IT编程>移动开发>Android > Android 实现无网络页面切换的示例代码

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

汕头除甲醛,顽皮仙子异世游,群组

本文介绍了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);
  }

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网