Android 显示空页面工具类

这篇博客介绍如何封装一个Android空页面显示工具类,包括定义线性布局、管理视图及如何在项目中使用,以方便在数据加载为空或异常时展示给用户。此外,还提到了可以扩展实现无网络和加载失败页面的类似封装。

做项目肯定会遇到这样的需求,数据加载为空或者数据加载异常时候显示一个空页面给用户:
这里写图片描述

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

一直以来对封装都不是很在行,不积硅步无以至千里,先从最简单的做起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值