项目需要,自己整理了一个base类方便开发。先说明一下,这里没有多高深的原理或者技术,只是单纯的分享一点经验。给大家提供一点思路。

效果图:

分享一个Andriod Base类_JAVA

需求

在加载的时候显示LoadingView,在加载错误的时候显示ErrorView,加载成功时则显示正常的内容ContentView。

布局

BaseActivity的布局文件act_base.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="true"
    android:fitsSystemWindows="true">
    <FrameLayout
        android:id="@+id/fl_base_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <FrameLayout
        android:id="@+id/fl_base_container"
        android:layout_below="@id/fl_base_header"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <FrameLayout
        android:id="@+id/fl_base_loading"
        android:layout_below="@id/fl_base_header"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"/>
    <FrameLayout
        android:id="@+id/fl_base_error"
        android:layout_below="@id/fl_base_header"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"/></RelativeLayout>

可以 看到我这里写了四个FrameLayout,其中fl_base_header是预留给顶部标题栏使用,fl_base_container预留给内容填空使用,fl_base_loading预留给加载中页面使用,fl_base_error预留给加载错误时使用。

开始添加

下面我们把这些View合理添加到BaseActivity类里去。

    FrameLayout headerLayout;
    FrameLayout containerLayout;
    FrameLayout loadingView;
    FrameLayout errorView;    
    private void findViews(){
        headerLayout= (FrameLayout) findViewById(R.id.fl_base_header);
        containerLayout= (FrameLayout) findViewById(R.id.fl_base_container);
        loadingView= (FrameLayout) findViewById(R.id.fl_base_loading);
        errorView= (FrameLayout) findViewById(R.id.fl_base_error);
    }    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        initBaseData();        super.setContentView(R.layout.act_base);
        findViews();
        initHeaderLayout();
        initLoadingView();
        initErrorView();
    }

重写setContentView()

在onCreate()方法中,先调用父类的setContentView方法,将act_base加载。然后,我们需要重写setContentView方法,方便子类调用设置

 @Override    public void setContentView(@LayoutRes int layoutResID) {
        View view= LayoutInflater.from(this).inflate(layoutResID,containerLayout,true);
        ButterKnife.bind(this,view);
        initActivity();

    }

    @Override    public void setContentView(View view) {
        containerLayout.addView(view);
        ButterKnife.bind(this,view);
        initActivity();

    }

    @Override    public void setContentView(View view, ViewGroup.LayoutParams params) {
        containerLayout.addView(view,params);
        ButterKnife.bind(this,view);
        initActivity();
    }

在上面我将setContentView里的参数view添加到了containerLayout上,也就是要显示的内容里面。

添加HeaderView

  /**
     * 添加头部布局,类似自定义toolbar
     * @param headerLayoutResID
     */
    public void setHeaderLayout(@LayoutRes int headerLayoutResID){
        View headerView= LayoutInflater.from(this).inflate(headerLayoutResID,headerLayout,true);
    }    public void setHeaderLayout(View headerView){
        headerLayout.addView(headerView);
    }

添加LoadingView

 /**
     * 添加loadingView
     * @param layoutResID
     */
    public void setLoadingView(@LayoutRes int layoutResID){
        LayoutInflater.from(this).inflate(layoutResID,loadingView,true);
    }    public void setLoadingView(View loadingView){        this.loadingView.addView(loadingView);
    }

添加ErrorView

 /**
     * 添加错误显示布局
     * @param layoutResID 布局ID
     */
    public void setErrorView(@LayoutRes int layoutResID){
        LayoutInflater.from(this).inflate(layoutResID,errorView,true);
    }    /**
     * 添加错误显示布局
     * @param errorView 错误View
     */
    public void setErrorView(View errorView){        this.errorView.addView(errorView);
    }

通过状态量控件显示哪个View

/**
     * 通过状态显示加载页面,内容页面,错误页面
     * @param showLoading
     * @param showContainer
     * @param showErrorView
     */
    public void showViewByState(boolean showLoading,boolean showContainer,boolean showErrorView){
        showView(loadingView,showLoading);
        showView(containerLayout,showContainer);
        showView(errorView,showErrorView);
    }    private void showView(View view, boolean show){        if(show){
            view.setVisibility(View.VISIBLE);
        }else{
            view.setVisibility(View.GONE);
        }
    }

写一个风格合适的头、加载、错误页面

一般来说,每个app的加载显示,错误页面显示都是一样的,所以为了更加方便,我们再写一个默认的标题栏,加载页面与错误显示页面。

https://mp.weixin.qq.com/s/CA4f_MwGucWwAW5K022dLA