本人已整理好发布到github,已优化。

github地址:https://github.com/buhuiming/StatusLayoutManager

 使用:compile 'com.bhm.sdk.manager.library:StatusLayoutManager:1.0.0'

有这样的情况,打开activity,加载数据;如果没有网络,显示没有网络的友好提示布局;如果没有数据,显示空数据的友好提示布局....

像这样的情况,我遇到过大约有6个不一样的布局,在不同的场景下展示。那么,如果把这些布局都写到每个需要的xml中,然后在代码中

根据不同的场景去切换,想想,是不是很可怕!

 下面介绍下我写的工具类,进一步提高集成的效率。

1.明确下,有哪些场景下需要展示的布局,并生成对应的xml布局;

2.动手写StatusLayoutManager,主要是将以上的布局添加到ViewGroup中,而ViewGroup就是Activity中setContentView的布局,举个例子:

假如一个页面包含了toolbar、viewpager和listView,toolbar包含标题,viewPager是图片轮播器,listView展示数据;那么假如展示网络异

常数据布局,viewpager和listView必须隐藏,这个时候viewpager和listView给他们一个布局套起来,这个布局成为内容布局ContentView;

3.调用:

在对应的场景下,调用对应的语句显示对应的布局:

目前StatusLayoutManager中的几个布局只能是在一样的位置显示或隐藏,而如果登录布局需要显示在toolbar下,空数据布局需要显示

在viewpager下,这样的情况咱不能实现,针对这样的情况,可以稍微进行改造。

StatusLayoutManager的内容:

public class StatusLayoutManager {
  final Context context;
  final View contentView;//内容布局
  final View emptyDataView;//空布局
  final View netWorkErrorView;//网络异常布局
  final View unCompleteView;//简历不完善布局
  final View noResumeView;//无简历布局
  final View unLoginView;//未登录布局
  final View rootLayout;//上一层父布局

  final OnRetryListener onRetryListener;
  final Button btn_empty_data,btn_net_work_error,btn_uncomplete,btn_no_resume,btn_chance_login,btn_chance_zhuce;

  public StatusLayoutManager(Builder builder) {
    this.context = builder.context;
    this.contentView = builder.contentView;
    this.rootLayout = builder.rootLayout;
    this.onRetryListener = builder.onRetryListener;
    ViewGroup viewGroup = (ViewGroup) rootLayout;
    emptyDataView = LayoutInflater.from(context).inflate(R.layout.empty_data_view, null);
    netWorkErrorView = LayoutInflater.from(context).inflate(R.layout.net_work_error_view, null);
    unCompleteView = LayoutInflater.from(context).inflate(R.layout.uncomplete_view, null);
    noResumeView = LayoutInflater.from(context).inflate(R.layout.no_resume_view, null);
    unLoginView = LayoutInflater.from(context).inflate(R.layout.unlogin_view, null);
    ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    viewGroup.addView(emptyDataView,params);
    viewGroup.addView(netWorkErrorView,params);
    viewGroup.addView(unCompleteView,params);
    viewGroup.addView(noResumeView,params);
    viewGroup.addView(unLoginView,params);
    contentView.setVisibility(View.VISIBLE);
    emptyDataView.setVisibility(View.GONE);
    netWorkErrorView.setVisibility(View.GONE);
    unCompleteView.setVisibility(View.GONE);
    noResumeView.setVisibility(View.GONE);
    unLoginView.setVisibility(View.GONE);
    btn_empty_data = (Button) emptyDataView.findViewById(R.id.btn_empty_data);
    btn_net_work_error = (Button) netWorkErrorView.findViewById(R.id.btn_net_work_error);
    btn_uncomplete = (Button) unCompleteView.findViewById(R.id.btn_uncomplete);
    btn_no_resume = (Button) noResumeView.findViewById(R.id.btn_no_resume);
    btn_chance_login = (Button) unLoginView.findViewById(R.id.btn_chance_login);
    btn_chance_zhuce = (Button) unLoginView.findViewById(R.id.btn_chance_zhuce);
    btn_empty_data.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub
        if (ButtonDelayClick.isFastClick()) {
            return;
        }
        if(!CjolApplication.isNetworkAvailable(context)){//无网络
          showNetWorkErrorView();
          Toast.makeText(context, context.getResources().getString(R.string.qjcndwl),
          Toast.LENGTH_SHORT).show();
          return;
        }
        showContentView();
        onRetryListener.onRetry(R.id.btn_empty_data);
      }
    });
    btn_net_work_error.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub
      if (ButtonDelayClick.isFastClick()) {
        return;
      }
      if(!CjolApplication.isNetworkAvailable(context)) {//无网络
        showNetWorkErrorView();
        Toast.makeText(context, context.getResources().getString(R.string.qjcndwl),
        Toast.LENGTH_SHORT).show();
        return;
      }
      showContentView();
      onRetryListener.onRetry(R.id.btn_net_work_error);
      }
    });
    btn_uncomplete.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub
        if (ButtonDelayClick.isFastClick()) {
          return;
        }
        if(!CjolApplication.isNetworkAvailable(context)) {//无网络
          showNetWorkErrorView();
          Toast.makeText(context, context.getResources().getString(R.string.qjcndwl),
          Toast.LENGTH_SHORT).show();
          return;
        }
        onRetryListener.onRetry(R.id.btn_uncomplete);
      }
    });
    btn_no_resume.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub
        if (ButtonDelayClick.isFastClick()) {
          return;
        }
        if(!CjolApplication.isNetworkAvailable(context)) {//无网络
          showNetWorkErrorView();
          Toast.makeText(context, context.getResources().getString(R.string.qjcndwl),
          Toast.LENGTH_SHORT).show();
          return;
        }
        onRetryListener.onRetry(R.id.btn_no_resume);
      }
    });
    btn_chance_login.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub
        if (ButtonDelayClick.isFastClick()) {
          return;
        }
        if(!CjolApplication.isNetworkAvailable(context)) {//无网络
          showNetWorkErrorView();
          Toast.makeText(context, context.getResources().getString(R.string.qjcndwl),
          Toast.LENGTH_SHORT).show();
          return;
        }
        onRetryListener.onRetry(R.id.btn_chance_login);
      }
    });
    btn_chance_zhuce.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
      if (ButtonDelayClick.isFastClick()) {
        return;
      }
      if(!CjolApplication.isNetworkAvailable(context)) {//无网络
        showNetWorkErrorView();
        Toast.makeText(context, context.getResources().getString(R.string.qjcndwl),
        Toast.LENGTH_SHORT).show();
        return;
      }
      onRetryListener.onRetry(R.id.btn_chance_zhuce);
     }
  });
}

/**
* 显示内容
*/
  public void showContentView() {
    if(contentView.getVisibility() == View.GONE){
      contentView.setVisibility(View.VISIBLE);
      emptyDataView.setVisibility(View.GONE);
      netWorkErrorView.setVisibility(View.GONE);
      unCompleteView.setVisibility(View.GONE);
      noResumeView.setVisibility(View.GONE);
      unLoginView.setVisibility(View.GONE);
    }
  }

/**
* 显示空数据
*/
  public void showEmptyDataView() {
    if(emptyDataView.getVisibility() == View.GONE){
      contentView.setVisibility(View.GONE);
      emptyDataView.setVisibility(View.VISIBLE);
      netWorkErrorView.setVisibility(View.GONE);
      unCompleteView.setVisibility(View.GONE);
      noResumeView.setVisibility(View.GONE);
      unLoginView.setVisibility(View.GONE);
    }
  }

/**
* 显示网络异常
*/
  public void showNetWorkErrorView() {
    if(netWorkErrorView.getVisibility() == View.GONE){
      contentView.setVisibility(View.GONE);
      emptyDataView.setVisibility(View.GONE);
      netWorkErrorView.setVisibility(View.VISIBLE);
      unCompleteView.setVisibility(View.GONE);
      noResumeView.setVisibility(View.GONE);
      unLoginView.setVisibility(View.GONE);
    }
  }

/**
* 显示简历不完整
*/
  public void showUnCompleteView() {
    if(unCompleteView.getVisibility() == View.GONE){
      contentView.setVisibility(View.GONE);
      emptyDataView.setVisibility(View.GONE);
      netWorkErrorView.setVisibility(View.GONE);
      unCompleteView.setVisibility(View.VISIBLE);
      noResumeView.setVisibility(View.GONE);
      unLoginView.setVisibility(View.GONE);
    }
  }

/**
* 显示无简历
*/
  public void showNoResumeView() {
    if(noResumeView.getVisibility() == View.GONE){
      contentView.setVisibility(View.GONE);
      emptyDataView.setVisibility(View.GONE);
      netWorkErrorView.setVisibility(View.GONE);
      unCompleteView.setVisibility(View.GONE);
      noResumeView.setVisibility(View.VISIBLE);
      unLoginView.setVisibility(View.GONE);
    }
  }

/**
* 显示网络异常
*/
  public void showUnLoginView() {
    if(unLoginView.getVisibility() == View.GONE){
      contentView.setVisibility(View.GONE);
      emptyDataView.setVisibility(View.GONE);
      netWorkErrorView.setVisibility(View.GONE);
      unCompleteView.setVisibility(View.GONE);
      noResumeView.setVisibility(View.GONE);
      unLoginView.setVisibility(View.VISIBLE);
    }
  }

  public static final class Builder {

    private Context context;
    private View rootLayout;
    private View contentView;
    private OnRetryListener onRetryListener;

    public Builder(Context context) {
      this.context = context;
    }

    public Builder setContentView(View contentView) {
      this.contentView = contentView;
      return this;
    }

    public Builder setRootLayoutView(View rootLayout){
      this.rootLayout = rootLayout;
      return this;
    }

    public Builder onRetryListener(OnRetryListener onRetryListener) {
      this.onRetryListener = onRetryListener;
      return this;
    }

    public StatusLayoutManager build() {

      return new StatusLayoutManager(this);
    }
  }

  public static Builder newBuilder(Context context) {
    return new Builder(context);
  }
}

Android常规布局(网络异常布局、空数据布局,未登录布局等)切换工具类,Layout切换的更多相关文章

  1. 数据持久化之SP的优化—送工具类

    第一点:sp存储的是键值对 getSharedPreferences 第一个參数是你保存文件的名字,第个是保存的模式一般能够默觉得0 先看普通 使用SP 存储String类型字符串吧 SharedPr ...

  2. 将数据按照gzip当时解压的工具类

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; impo ...

  3. Android开发之获取APP的应用程序名称以及版本名称信息java工具类

    //跟App相关的辅助类 public class AppUtils { private AppUtils() { /* cannot be instantiated */ throw new Uns ...

  4. 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现

    相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人 ...

  5. Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】

    package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...

  6. android ImageLoader加载本地图片的工具类

    import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; /** * 异步 ...

  7. 015 Android md5密码加密及其工具类

    1.md5加密介绍 MD5算法是广泛使用的杂凑函数,也就是哈希函数,英文全拼是:Message Digest Algorithm,对应的中文名字是消息摘要算法. MD5加密:将字符串转换成 32位的字 ...

  8. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

  9. Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. RSA私钥加密公钥解密、各种密钥格式转换

    此随笔解决RSA加解密相关的3个问题,详情可以查看源码. 1.公钥加密.私钥解密2.各种格式RSA密钥之间的转换3.不限制加密原文的长度

  2. ubuntu hadoop伪分布式部署

    环境 ubuntu hadoop2.8.1 java1.8 1.配置java1.8 2.配置ssh免密登录 3.hadoop配置 环境变量 配置hadoop环境文件hadoop-env.sh core ...

  3. 关于mybatis的 insert into select 命令未结束问题

    关于mybatis的 insert into select 命令未结束问题,最后以为是sql写错了,可是,在plsql运行又没问题.最后还是解决这个问题. 是设置问题. ### Cause: java ...

  4. 另外几种Java集合框架具体解释续

    另外几种Java集合框架具体解释续 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs fastutil库优于Trove库的 ...

  5. 2016/2/24 1,dotctype有几种? 2,了解html的发展历史

    1,dotctype有几种?DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本. 其中的DTD(例如上例中的xhtml1-transition ...

  6. how to create modals with Bootstrap

    In this tutorial you will learn how to create modals with Bootstrap. Creating Modals with Bootstrap ...

  7. YTU 2558: 游起来吧!超妹!

    2558: 游起来吧!超妹! 时间限制: 1 Sec  内存限制: 128 MB 提交: 70  解决: 22 题目描述 夏天到了,无聊的超妹跑到了落雪湖里抓鱼吃.结果,游到湖的正中 央时被湖边保安看 ...

  8. Android ConstraintLayout详解

    1. 概述 在本篇文章中,你会学习到有关ConstraintLayout -- 一种构建于弹性Constraints(约束)系统的新型Android Layout.最终你将会在Android Stud ...

  9. DoDataExchange的作用

    void CDlgSelectCS::DoDataExchange(CDataExchange* pDX) {     CDialog::DoDataExchange(pDX);     DDX_Te ...

  10. 【180】IDL 读写 HDF 文件

    HDF(Hierarchical Data Formats)数据格式由 NCSA 开发.HDF 提供了大量的数据模式,包括多维数组.表格.图像.注解和调色板.在下面的章节中,将描述 HDF 科学数据系 ...