MultiStateLayout

A customize multiple state layout for Android.

MultiStateLayoutb

Usage

Gradle

Step 1. Add the JitPack repository to your build file
allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}
Step 2. Add the dependency
dependencies {
    compile 'com.github.andyxialm:MultiStateLayout:0.1.1'
}

Maven

Step 1. Add the JitPack repository to your build file
<repositories>
    <repository>
        <id>jitpack.io</id>
	<url>https://jitpack.io</url>
    </repository>
</repositories>
Step 2. Add the dependency
<dependency>
    <groupId>com.github.andyxialm</groupId>
    <artifactId>MultiStateLayout</artifactId>
    <version>0.1.1</version>
</dependency>
Edit your layout XML:
<cn.refactor.multistatelayout.MultiStateLayout
    android:id="@+id/multi_state_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:state="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    state:layout_network_error="@layout/layout_custom_network_error"
    state:animEnable="true"
    state:animDuration="500">

    <!-- content layout -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello World!"/>

</cn.refactor.multistatelayout.MultiStateLayout>
Common Configuration
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        MultiStateConfiguration.Builder builder = new MultiStateConfiguration.Builder();
        builder.setCommonEmptyLayout(R.layout.layout_empty)
               .setCommonErrorLayout(R.layout.layout_error)
               .setCommonLoadingLayout(R.layout.layout_loading);
        MultiStateLayout.setConfiguration(builder);
    }
}
How to change state?

mMultiStateLayout.setState(MultiStateLayout.State.CONTENT);

mMultiStateLayout.setState(MultiStateLayout.State.EMPTY);

mMultiStateLayout.setState(MultiStateLayout.State.LOADING);

mMultiStateLayout.setState(MultiStateLayout.State.ERROR);

mMultiStateLayout.setState(MultiStateLayout.State.NETWORK_ERROR);

mMultiStateLayout.setOnStateViewCreatedListener(new OnStateViewCreatedListener() {
    @Override
    public void onViewCreated(View view, int state) {
        switch (state) {
            case MultiStateLayout.State.NETWORK_ERROR:
                view.findViewById(R.id.btn_reload).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                    }
                });
                break;
            ...
            default:
                break;
        }
    }
});

Add a listener that will be invoked whenever the state view changes or is incrementally.

mMultiStateLayout.addOnStateChangedListener(new OnStateChangedListener() {
    @Override
    public void onChanged(int state) {
        
    }
});

How to add customize state view?
View customStateView = LayoutInflater.from(this).inflate(R.layout.layout_custom_notice, mStateLayout, false);
mStateLayout.putCustomStateView(KEY_CUSTOM_STATE, customStateView);
Show customize state view.
mStateLayout.setCustomState(KEY_CUSTOM_STATE);
How to customise transition animation?
mStateLayout.setTransitionAnimator(new TransitionAnimatorLoader() {
    @Override
    public ObjectAnimator loadAnimator(View targetView) {
        ObjectAnimator customAnimator = ObjectAnimator.ofFloat(targetView, "alpha", 0.0f, 1.0f)
                                                      .setDuration(500);
        customAnimator.setInterpolator(new AccelerateInterpolator());
        return customAnimator;
    }
});

MultiStateLayout

可支持自定义状态的多状态视图组件。

引入方式

Gradle

Step 1. Add the JitPack repository to your build file
allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}
Step 2. Add the dependency
dependencies {
    compile 'com.github.andyxialm:MultiStateLayout:0.1.1'
}

Maven

Step 1. Add the JitPack repository to your build file
<repositories>
    <repository>
        <id>jitpack.io</id>
	<url>https://jitpack.io</url>
    </repository>
</repositories>
Step 2. Add the dependency
<dependency>
    <groupId>com.github.andyxialm</groupId>
    <artifactId>MultiStateLayout</artifactId>
    <version>0.1.1</version>
</dependency>
布局文件中增加 MultiStateLayout,包裹内容布局:
<cn.refactor.multistatelayout.MultiStateLayout
    android:id="@+id/multi_state_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:state="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    state:layout_network_error="@layout/layout_custom_network_error"
    state:animEnable="true"
    state:animDuration="500">

    <!-- content layout -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello World!"/>

</cn.refactor.multistatelayout.MultiStateLayout>
配置公共属性
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        MultiStateConfiguration.Builder builder = new MultiStateConfiguration.Builder();
        builder.setCommonEmptyLayout(R.layout.layout_empty)
               .setCommonErrorLayout(R.layout.layout_error)
               .setCommonLoadingLayout(R.layout.layout_loading);
        MultiStateLayout.setConfiguration(builder);
    }
}
如何切换状态?

mMultiStateLayout.setState(MultiStateLayout.State.CONTENT);

mMultiStateLayout.setState(MultiStateLayout.State.EMPTY);

mMultiStateLayout.setState(MultiStateLayout.State.LOADING);

mMultiStateLayout.setState(MultiStateLayout.State.ERROR);

mMultiStateLayout.setState(MultiStateLayout.State.NETWORK_ERROR);

mMultiStateLayout.setOnStateViewCreatedListener(new OnStateViewCreatedListener() {
    @Override
    public void onViewCreated(View view, int state) {
        switch (state) {
            case MultiStateLayout.State.NETWORK_ERROR:
                view.findViewById(R.id.btn_reload).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                    }
                });
                break;
            ...
            default:
                break;
        }
    }
});

GitHub