Android自定义切换布局(请求中,无网络,无数据等)

来源:互联网 发布:腾讯大王卡扫号软件 编辑:程序博客网 时间:2024/04/27 20:50

在一般的项目中,像请求中、无数据、无网络、请求超时等这些状态的布局我们需要经常切换。
在之前的项目中,我是在每个需要显示这些布局的xml文件中都include请求中,无数据,无网络等这些布局,然后再Activity中控制他们的显示与隐藏,虽然能实现效果,但是控制起来很麻烦,重复的代码也很多。如下图:
1.声明变量:
声明变量
2.获取资源ID
获取资源ID
3.初始化showView
这里写图片描述
4.控制显示与隐藏
这里写图片描述
5.showView代码
这里写图片描述

可以看到,很麻烦。所以,就有了写一个专门用来管理这些状态布局的类的想法。方便以后的开发。
下面我们来实现它,直接看代码,注释很详细:
1.shouView类:

package com.yzq.testshowview;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;/** * Created by yzq on 2016/10/18. * 控制布局的切换 */public class ShowView extends LinearLayout implements View.OnClickListener {    private View view;    private LinearLayout loaddingLayout;//加载中布局    private LinearLayout abnormalLayout;//异常布局  (无数据,无网络,请求超时)    private ImageView hintImg;//提示图片    private TextView hintTv;//提示文字    private Button refreshBtn;//刷新按钮    public static final int LOADDING = 0;//加载中    public static final int NO_DATA = 1;//无数据    public static final int NO_NET = 2;//无网络    public static final int TIME_OUT = 3;//超时    private RetryListerner retryListener;//重试    public ShowView(Context context) {        super(context);        initView(context);    }    public ShowView(Context context, AttributeSet attrs) {        super(context, attrs);        initView(context);    }    public ShowView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView(context);    }    private void initView(Context context) {        Log.i("初始化view", "initView");        LayoutInflater inflater = (LayoutInflater) context                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);        view = inflater.inflate(R.layout.show_view_layout, this);        loaddingLayout = (LinearLayout) view.findViewById(R.id.loaddingLayout);        abnormalLayout = (LinearLayout) view.findViewById(R.id.abnormalLayout);        hintImg = (ImageView) view.findViewById(R.id.hintImg);        hintTv = (TextView) view.findViewById(R.id.hintTv);        refreshBtn = (Button) view.findViewById(R.id.refreshBtn);        refreshBtn.setOnClickListener(this);        show(LOADDING);//显示加载中    }    @Override    public void onClick(View v) {        show(LOADDING);//显示加载中        retryListener.retry();//执行重试逻辑    }    /*设置重试监听*/    public void setOnRetryListener(RetryListerner retryListener) {        this.retryListener = retryListener;    }    public void show(int i) {        view.setVisibility(VISIBLE);        switch (i) {            case LOADDING:                /*加载中*/                loaddingLayout.setVisibility(VISIBLE);                abnormalLayout.setVisibility(GONE);                break;            case NO_DATA:                /*暂无数据*/                loaddingLayout.setVisibility(GONE);                abnormalLayout.setVisibility(VISIBLE);                hintImg.setImageResource(R.drawable.no_data);                hintTv.setText(R.string.noData);                break;            case NO_NET:                /*无网络*/                loaddingLayout.setVisibility(GONE);                abnormalLayout.setVisibility(VISIBLE);                hintImg.setImageResource(R.drawable.no_net);                hintTv.setText(R.string.noNet);                break;            case TIME_OUT:                /*超时*/                loaddingLayout.setVisibility(GONE);                abnormalLayout.setVisibility(VISIBLE);                hintImg.setImageResource(R.drawable.no_data);                hintTv.setText(R.string.timeOut);                break;        }    }    public interface RetryListerner {        void retry();    }}

2.在MainActivity中使用:

package com.yzq.testshowview;import android.os.Bundle;import android.os.Handler;import android.support.v7.app.AppCompatActivity;import android.util.Log;public class MainActivity extends AppCompatActivity implements ShowView.RetryListerner {    private ShowView showView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        showView.setOnRetryListener(this);//设置监听        /*模拟无数据*/        new Handler().postDelayed(new Runnable() {            @Override            public void run() {                showView.show(ShowView.NO_DATA);            }        }, 1000 * 3);    }    private void initView() {        showView = (ShowView) findViewById(R.id.showView);    }    @Override    public void retry() {        Log.i("重试", "刷新");        /*模拟无网络*/        new Handler().postDelayed(new Runnable() {            @Override            public void run() {                showView.show(ShowView.NO_NET);            }        }, 1000 * 3);    }}

这样就方便多了。下面是demo,需要的可以下载看下效果:
demo

2 0