全网整合营销服务商

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

免费咨询热线: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实现多个页面切换效果  # 切换到  # 自己的  # 是在  # 重写  # 的是  # 都是  # 定长  # 加载  # 第一个  # 多个  # 遍历  # 请重试  # 给大家  # 更高  # 可以直接  # 只在  # 不为  # 第三方  # 这样子  # 来实现 


相关文章: 制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  已有域名如何快速搭建专属网站?  建站之星如何快速更换网站模板?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  建站之星多图banner生成与模板自定义指南  西安大型网站制作公司,西安招聘网站最好的是哪个?  建站主机选虚拟主机还是云服务器更好?  XML的“混合内容”是什么 怎么用DTD或XSD定义  小程序网站制作需要准备什么资料,如何制作小程序?  如何通过山东自助建站平台快速注册域名?  建站之星伪静态规则如何正确配置?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  建站主机服务器选购指南:轻量应用与VPS配置解析  中山网站推广排名,中山信息港登录入口?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  家庭服务器如何搭建个人网站?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  实例解析angularjs的filter过滤器  贸易公司网站制作流程,出口贸易网站设计怎么做?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  高防服务器租用指南:配置选择与快速部署攻略  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  制作公司内部网站有哪些,内网如何建网站?  ,南京靠谱的征婚网站?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何用花生壳三步快速搭建专属网站?  香港服务器租用费用高吗?如何避免常见误区?  微信推文制作网站有哪些,怎么做微信推文,急?  利用JavaScript实现拖拽改变元素大小  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  建站之星安装提示数据库无法连接如何解决?  网站制作壁纸教程视频,电脑壁纸网站?  如何选择最佳自助建站系统?快速指南解析优劣  如何通过免费商城建站系统源码自定义网站主题与功能?  如何通过远程VPS快速搭建个人网站?  网站图片在线制作软件,怎么在图片上做链接?  ,在苏州找工作,上哪个网站比较好?  如何快速生成凡客建站的专业级图册?  如何挑选优质建站一级代理提升网站排名?  韩国服务器如何优化跨境访问实现高效连接?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何选择香港主机高效搭建外贸独立站?  如何选择靠谱的建站公司加盟品牌?  营销式网站制作方案,销售哪个网站招聘效果最好? 

您的项目需求

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