做项目肯定会遇到这样的需求,数据加载为空或者数据加载异常时候显示一个空页面给用户:
这篇blog就来实现这样一个简单的封装
1.首先定义一个线性布局
2.然后通过一个工具类来管理这样一个View
先来看自定义的线性布局
public class EmptyLayout extends LinearLayout{
/**
* 空页面图片
*/
private ImageView emptyImg;
/**
* 空页面文本
*/
private TextView emptyTv;
/**
* 空文字
*/
private String emptyText;
/**
* 空文字颜色
*/
private int emptyTextColor;
/**
* 空文字大小
*/
private float emptyTextSize;
/**
* 空图片
*/
private Drawable emptyDrawable;
/**
* 图片宽度
*/
private int imgWidth;
/**
* 图片高度
*/
private int imgHeight;
public EmptyLayout(Context context) {
this(context ,null);
}
public EmptyLayout(Context context, AttributeSet attrs) {
this(context, attrs ,0);
}
public EmptyLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//初始化布局
initView();
//初始化参数
initDatas();
}
/**
* 初始化布局
*/
private void initView(){
View view= LayoutInflater.from(getContext()).inflate(R.layout.empty_layout,this);//注意inflate方法的parent传入LinearLayout
emptyImg= (ImageView) view.findViewById(R.id.common_iv);
emptyTv= (TextView) view.findViewById(R.id.common_tv);
}
/**
* 设置文本
*/
public void setEmptyText(String emptyText) {
this.emptyText=emptyText;
if(emptyText!=null)
emptyTv.setText(emptyText);
}
/**
* 设置文本颜色
*/
public void setEmptyTextColor(int emptyTextColor) {
this.emptyTextColor=emptyTextColor;
emptyTv.setTextColor(emptyTextColor);
}
/**
* 设置空文本字体大小
*
* @param emptyTextSize 单位是sp
*/
public void setEmptyTextSize(float emptyTextSize) {
this.emptyTextSize=emptyTextSize;
emptyTv.setTextSize(TypedValue.COMPLEX_UNIT_PX,emptyTextSize);
}
/**
* 设置图片
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void setEmptyDrawable(Drawable drawable) {
this.emptyDrawable=drawable;
emptyImg.setBackground(drawable);
}
/**
* 设置图片的宽度和高度
*/
public void setImgWH(int imgWidth ,int imgHeight) {
this.imgHeight=imgHeight;
this.imgWidth=imgWidth;
ViewGroup.LayoutParams lp=emptyImg.getLayoutParams();
lp.width=imgWidth;
lp.height=imgHeight;
emptyImg.setLayoutParams(lp);
}
/**
* 初始化参数
*/
public void initDatas(){
setEmptyText(emptyText);
setEmptyTextColor(emptyTextColor);
setEmptyTextSize(emptyTextSize);
setEmptyDrawable(emptyDrawable);
setImgWH(imgWidth,imgHeight);
}
}
代码很简单,简单的我都不知道说什么了,注释也比较清晰。
然后通过一个工具类来对这个布局进行初始化:
public class ViewUtil {
public static EmptyLayout getEmptyLayout(Context context ,String text){
EmptyLayout layout=new EmptyLayout(context);
layout.setEmptyText(text);
layout.setEmptyTextSize(CommonUtils.dip2px(context,15));
layout.setEmptyTextColor(context.getResources().getColor(R.color.colorAccent));
layout.setEmptyDrawable(context.getResources().getDrawable(R.mipmap.nodata));
layout.setImgWH(CommonUtils.dip2px(context, 69), CommonUtils.dip2px(context, 47));
//这里控制了
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, CommonUtils.dip2px(context, 300));
layout.setLayoutParams(params);
return layout;
}
}
也没有什么难度,用到一个dp转px的方法,很常见:
/**
* dp转px
*/
public static int dip2px(Context context ,float dpValue){
float density=context.getResources().getDisplayMetrics().density;
return (int)(dpValue*density+0.5);
}
最后看如何使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(ViewUtil.getEmptyLayout(this,"暂无数据"));
}
}
只需要在想用到该view的地方调用
ViewUtil.getEmptyLayout(this,"暂无数据")
同理的其实也可以类似实现无网络状况的页面,页面加载失败的页面等。而不需要我们在对应页面的布局中去写布局文件。
ps:最后在放一个对登陆与否方法的封装
/**
* 提示登录
* @param context
* @param clazz
*/
public static void isEnterLoginAct( final Context context,Class clazz) {
//获取登陆用户保存数据
boolean isLogin=TextUtils.isEmpty(GlobalParams.Token)
if (isLogin) {
Intent intent = new Intent(context, clazz);
context.startActivity(intent);
} else {
ShowDialogUtils.showInfoDialog(context, "您还没有登录,是否去登录?", new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, LoginAct.class);
context.startActivity(intent);
}
});
}
}
一直以来对封装都不是很在行,不积硅步无以至千里,先从最简单的做起。
时间: 2024-10-07 18:27:22