Часто в проектах возникают ситуации, когда новый открытый интерфейс требует загрузки данных с различными возможными состояниями. Необходимо отображать интерфейсы в зависимости от различных результатов. Этот процесс можно свести к пяти основным состояниям: начальное состояние Init, состояние запроса Loading, состояние отсутствия данных Empty, состояние сетевой ошибки NetError и успешное состояние запроса Content. Если несколько интерфейсов имеют этот процесс, то было бы полезно упаковать весь процесс вызова, что позволит упрощать вызовы и легко управлять всеми этапами.
StateFrameLayout
наследуется от FrameLayout
, внутри которого реализован механизм переключения между различными состояниями одним действием. Также внутри реализован кэширование состояний, поэтому нет необходимости беспокоиться о том, что состояние будет сброшено при повторной активации после сборки мусора (можно проверить это, открыв опцию "Не удерживать активность" в разделе разработчика).
Версии 2.0.0 и выше не совместимы с предыдущими версиями
Последняя версия доступна здесь
Добавление в Gradle
#last-version укажите последнюю версию из приведенной ссылки
#2.0.0 и выше используют MavenCentral, следуйте указаниям ниже
implementation 'com.lwkandroid.library:StateFrameLayout:last-version'
```### Глобальная конфигурация
С версии 2.0.0 поддерживаются глобальные настройки, позволяющие установить общие параметры для всех компонентов. Пример конфигурации представлен ниже:
public class DemoApplication extends Application { @Override public void onCreate() { super.onCreate(); // Глобальная конфигурация StateFrameLayoutManager.getGlobalOptions() .setEmptyLayoutId(R.layout.layout_empty) // Идентификатор шаблона для состояния Empty .setLoadingLayoutId(R.layout.layout_loading) // Идентификатор шаблона для состояния Loading .setNetErrorLayoutId(R.layout.layout_net_error) // Идентификатор шаблона для состояния NetError .setEnableContentAnim(true) // Разрешение анимации содержимого .setContentAnim(new BaseContentAnimation()) // Объект анимации содержимого, можно использовать наследование от BaseContentAnimation для создания собственной анимации } }
### Определение в XML
```xml
<com.lwkandroid.widget.StateFrameLayout
android:id="@+id/stateLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:enableContentAnim="true" <!-- Включает ли анимацию при отображении содержимого (по умолчанию 200 миллисекунд анимация прозрачности) -->
app:emptyLayoutResId="@layout/layout_empty" <!-- ID представления пустого состояния -->
app:loadingLayoutResId="@layout/layout_loading" <!-- ID представления состояния загрузки -->
app:netErrorLayoutResId="@layout/layout_net_error" <!-- ID представления состояния ошибки сети -->
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Это содержимое"
android:textAppearance="?android:textAppearanceLarge"/>
</com.lwkandroid.widget.StateFrameLayout>
### Использование в коде
```java
StateFrameLayout mStateFrameLayout = (StateFrameLayout) findViewById(R.id.stateLayout);
// ID пустого состояния
mStateFrameLayout.setEmptyLayoutId(R.layout.layout_empty2);
// ID состояния загрузки
mStateFrameLayout.setLoadingLayoutId(R.layout.layout_loading);
// ID состояния ошибки сети
mStateFrameLayout.setNetErrorLayoutId(R.layout.layout_net_error);
// Установка анимации отображения содержимого
mStateFrameLayout.setContentAnimation(BaseContentAnimation animation);
// Переключение на начальное состояние Init, все view невидимы, это также является начальным состоянием после завершения загрузки StateFrameLayout
mStateFrameLayout.switchToInitState();
// Переключение на пустое состояние
mStateFrameLayout.switchToEmptyState();
// Переключение на состояние загрузки
mStateFrameLayout.switchToLoadingState();
// Переключение на состояние ошибки сети
mStateFrameLayout.switchToNetErrorState();
// Переключение на состояние содержимого
mStateFrameLayout.switchToContentState();
Не требуется специальная конфигурация ProGuard
MaterialPageStateLayout: https://github.com/Syehunter/MaterialPageStateLayout
Благодарю всех, кто вносит свой вклад в развитие open source!
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )