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

在一般的项目中,像请求中、无数据、无网络、请求超时等这些状态的布局我们需要经常切换。
在之前的项目中,我是在每个需要显示这些布局的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

©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值