Android常规布局(网络异常布局、空数据布局,未登录布局等)切换工具类,Layout切换
本人已整理好发布到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切换的更多相关文章
- 数据持久化之SP的优化—送工具类
第一点:sp存储的是键值对 getSharedPreferences 第一个參数是你保存文件的名字,第个是保存的模式一般能够默觉得0 先看普通 使用SP 存储String类型字符串吧 SharedPr ...
- 将数据按照gzip当时解压的工具类
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; impo ...
- Android开发之获取APP的应用程序名称以及版本名称信息java工具类
//跟App相关的辅助类 public class AppUtils { private AppUtils() { /* cannot be instantiated */ throw new Uns ...
- 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现
相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人 ...
- Android Bitmap与DrawAble与byte[]与InputStream之间的转换工具类【转】
package com.soai.imdemo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; ...
- android ImageLoader加载本地图片的工具类
import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; /** * 异步 ...
- 015 Android md5密码加密及其工具类
1.md5加密介绍 MD5算法是广泛使用的杂凑函数,也就是哈希函数,英文全拼是:Message Digest Algorithm,对应的中文名字是消息摘要算法. MD5加密:将字符串转换成 32位的字 ...
- Android之三种网络请求解析数据(最佳案例)
AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- cmd下复制粘贴
cmd下复制粘贴的快捷操作方式 工具/原料 系统cmd 步骤/方法 1 如右图,右键命令提示符窗口的标题栏,选择属性. 2 选择“编辑选项”里的“快速编辑模式”,并确定之: 3 在弹出的应用选择提示框 ...
- BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并
2243: [SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数 ...
- Android系统input按键处理流程(从驱动到framework)【转】
本文转载自:http://blog.csdn.net/jwq2011/article/details/51234811 (暂时列出提纲,后续添加具体内容) 涉及到的几个文件: 1.out/target ...
- HDU1281 棋盘游戏 —— 二分图最大匹配 + 枚举
题目链接:https://vjudge.net/problem/HDU-1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- YTU 2920: Shape系列-7
2921: Shape系列-7 时间限制: 1 Sec 内存限制: 128 MB 提交: 156 解决: 129 题目描述 小强做的Shape类在本次的测试中出了点状况,发现原来是其中的area函 ...
- Windbg脚本和扩展工具开篇
好长一段时间没写文章了,最近一直忙于为项目的可调式性做一些脚本和扩展工具,鉴于对windbg强大威力的震撼,以及相对较少的资料,笔者决定写一系列关于如何开发Windbg脚本和扩展命令的文章,您的支持是 ...
- IJ:IJ来了
ylbtech-IJ:IJ来了 1.返回顶部 1. 2. 2.2. 3. 4. 2.返回顶部 1. 2. 3. 3. Welcome to IntelliJ IDEA返回顶部 1. 2.2. 2.2. ...
- 微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出?
ylbtech-微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出? 1.返回顶部 1. 让创意变为现实,这30个小程序“凭什么”脱颖而出? 微信公开课 昨天 创意1:为多种 ...
- React VSCode插件
可以安装2个插件,一个是 Atuo Rename Tag 一个 Auto Close Tag 这样就好都了
- bzoj 2216: [Poi2011]Lightning Conductor【决策单调性dp+分治】
参考:https://blog.csdn.net/clove_unique/article/details/57405845 死活不过样例看了题解才发现要用double.... \[ a_j \leq ...