Android 使用ViewStub 实现多状态页面切换基类

1、ViewStub 的基本使用:

(1):布局文件


android:layout: 为引用的布局文件。 

(2):代码调用显示该ViewStub

try {
    //如果没有被inflate过,使用inflate膨胀
    View inflated = mVSLoading.inflate();
    AutoUtils.auto(inflated);
} catch (Exception e) {
    //如果使用inflate膨胀报错,使用setVisibility方法显示
    mVSLoading.setVisibility(View.VISIBLE);
}

2、状态动态切换activity 的基类的实现:

 

public abstract class BaseActivity extends AppCompatActivity {
    private ViewStub mVSLoading;
    private ViewStub mVSFailedToLoad;
    private ViewStub mVSNetworkError;
    private ViewStub mVSEmptyData;
    private ViewStub mVSNormalData;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_base);
        initView();
    }

    private void initView() {
        mVSLoading = findViewById(R.id.vs_loading);
        mVSFailedToLoad = findViewById(R.id.vs_failed_to_load);
        mVSNetworkError = findViewById(R.id.vs_network_error);
        mVSEmptyData = findViewById(R.id.vs_empty_data);
        mVSNormalData = findViewById(R.id.vs_normal_data);
    }

    @Override
    public void setContentView(int id) {
        mVSNormalData.setLayoutResource(id);
    }

    protected void setVSLoading() {
        initVisibility();
        try {
            //如果没有被inflate过,使用inflate膨胀
            View inflated = mVSLoading.inflate();
        } catch (Exception e) {
            //如果使用inflate膨胀报错,就说明已经被膨胀过了,使用setVisibility方法显示
            mVSLoading.setVisibility(View.VISIBLE);
        }
    }

    public void setVSFailedToLoad() {
        initVisibility();
        try {
            //如果没有被inflate过,使用inflate膨胀
            View inflated = mVSFailedToLoad.inflate();
            TextView textView = inflated.findViewById(R.id.textView);
            textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    setOnClickRefresh();
                }
            });
        } catch (Exception e) {
            //如果使用inflate膨胀报错,就说明已经被膨胀过了,使用setVisibility方法显示
            mVSFailedToLoad.setVisibility(View.VISIBLE);
        }
    }

    public void setVSNetworkError() {
        initVisibility();
        try {
            //如果没有被inflate过,使用inflate膨胀
            View inflated = mVSNetworkError.inflate();

        } catch (Exception e) {
            //如果使用inflate膨胀报错,就说明已经被膨胀过了,使用setVisibility方法显示
            mVSNetworkError.setVisibility(View.VISIBLE);
        }
    }

    public void setVSEmptyData() {
        initVisibility();
        try {
            //如果没有被inflate过,使用inflate膨胀
            mVSEmptyData.inflate();
        } catch (Exception e) {
            //如果使用inflate膨胀报错,就说明已经被膨胀过了,使用setVisibility方法显示
            mVSEmptyData.setVisibility(View.VISIBLE);
        }
    }

    public void setVSNormalData() {
        initVisibility();
        try {
            //如果没有被inflate过,使用inflate膨胀
            mVSNormalData.inflate();
        } catch (Exception e) {
            //如果使用inflate膨胀报错,就说明已经被膨胀过了,使用setVisibility方法显示
            mVSNormalData.setVisibility(View.VISIBLE);
        }
    }

    public void initVisibility() {
        mVSLoading.setVisibility(View.GONE);
        mVSFailedToLoad.setVisibility(View.GONE);
        mVSEmptyData.setVisibility(View.GONE);
        mVSNetworkError.setVisibility(View.GONE);
        mVSNormalData.setVisibility(View.GONE);
    }

    protected abstract void setOnClickRefresh();
}

 源代码下载

可根据自己需求进行扩展。

你可能感兴趣的:(Android)