全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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);
  }

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


# Android  # 无网络页面切换  # 实现页面切换  # Android实现移动小球和CircularReveal页面切换动画实例代码  # Android中TabLayout结合ViewPager实现页面切换  # Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果  # Android开发中ViewPager实现多页面切换效果  # Android中TabLayout结合ViewPager实现页面切换效果  # Android中使用TabHost 与 Fragment 制作页面切换效果  # Android使用Fragment打造万能页面切换框架  # Android编程之页面切换测试实例  # Android fragment实现多个页面切换效果  # 切换到  # 自己的  # 是在  # 重写  # 的是  # 都是  # 定长  # 加载  # 第一个  # 多个  # 遍历  # 请重试  # 给大家  # 更高  # 可以直接  # 只在  # 不为  # 第三方  # 这样子  # 来实现 


相关文章: 香港服务器网站卡顿?如何解决网络延迟与负载问题?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何选择靠谱的建站公司加盟品牌?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  大连网站制作公司哪家好一点,大连买房网站哪个好?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  建站168自助建站系统:快速模板定制与SEO优化指南  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  Swift中循环语句中的转移语句 break 和 continue  如何用y主机助手快速搭建网站?  网站制作的步骤包括,正确网址格式怎么写?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  韩国服务器如何优化跨境访问实现高效连接?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  南宁网站建设制作定制,南宁网站建设可以定制吗?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  网站制作壁纸教程视频,电脑壁纸网站?  如何在腾讯云服务器上快速搭建个人网站?  存储型VPS适合搭建中小型网站吗?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  黑客入侵网站服务器的常见手法有哪些?  如何在阿里云通过域名搭建网站?  网站制作公司排行榜,抖音怎样做个人官方网站  如何确认建站备案号应放置的具体位置?  如何在宝塔面板中修改默认建站目录?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  建站主机如何选?高性价比方案全解析  建站之星上传入口如何快速找到?  名字制作网站免费,所有小说网站的名字?  建站主机空间推荐 高性价比配置与快速部署方案解析  如何登录建站主机?访问步骤全解析  股票网站制作软件,网上股票怎么开户?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何选择高效可靠的多用户建站源码资源?  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何用好域名打造高点击率的自主建站?  开封网站制作公司,网络用语开封是什么意思?  如何在Golang中使用replace替换模块_指定本地或远程路径  C++时间戳转换成日期时间的步骤和示例代码  实惠建站价格推荐:2025年高性价比自助建站套餐解析  网站企业制作流程,用什么语言做企业网站比较好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。