Skip to content

Данная библиотека избавит вас от boilerplate-кода и автоматизирует показ и скрытие: ContentView, LoadingView, NoInternetView, EmptyContentView, ErrorView

License

Notifications You must be signed in to change notification settings

tanchuev/ActionViews-MVP

Repository files navigation

Download License: MIT

Описание

Если ваше приложение:

  • Работает с сетью, БД
  • Отображает данные
  • Отображает индикаторы загрузки
  • Отображает отсутствие соединения с сетью
  • Отображает отсутствие данных
  • Отображает какие-либо другие ошибки
  • Использует Kotlin
  • Использует RxJava 2 или RxKotlin 2
  • Использует MVP

То данная библиотека избавит вас от boilerplate-кода и автоматизирует показ и скрытие View для отображения:

Если ваше приложение использует ViewModel из Android Architecture Components - то есть ActionViews-ViewModel
Если ваше приложение использует kotlin-coroutines и MVVM - то есть [ActionViews-ViewModel-Coroutines](ссылка на будущую библиотеку, если я придумаю как внедрить этот механизм в корутины)
Если ваше приложение использует kotlin-coroutines и MVP - то есть [ActionViews-MVP-Coroutines](ссылка на будущую библиотеку, если я придумаю как внедрить этот механизм в корутины)

Все логики отображения и скрытия ActionViews уже написаны за вас, вам остается только пользоваться библиотекой!

Термины

Базовое поведение или Стандартное поведение - логики скрытия и показа ActionView в строго заданные моменты.

ActionView - любая View, которая реагирует на какое-то событие/действие. В библиотеке описано несколько типов ActionView и их базовое поведение.

Подробнее с базовым поведением и типами ActionViews вы можете ознакомиться тут.

Как пользоваться?

Чтобы начать использовать библиотеку вам достаточно сделать несколько шагов:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.tanchuev.actionviews.mvp.widget.NoInternetView
        android:id="@+id/noInternetView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:background="@color/white"
        android:gravity="center"
        android:visibility="gone"
        app:buttonText="@string/tryAgain"
        app:icon="@drawable/ic_no_internet"
        app:text="@string/errorNoInternet" />

    <com.tanchuev.actionviews.mvp.widget.EmptyContentView
        android:id="@+id/emptyContentView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:visibility="gone"
        app:buttonText="@string/tryAgain"
        app:icon="@drawable/ic_empty_content"
        app:text="@string/errorEmptyContent" />

    <com.tanchuev.actionviews.mvp.widget.ProgressBar
        android:id="@+id/loadingView"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:visibility="gone"
        app:progressColor="@color/black"
        tools:visibility="visible" />

    <ScrollView <!-- or any other View -->
        android:id="@+id/contentView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!-- some views for show data -->
    </ScrollView>

    <!-- also you can add some views outside ContentView -->
</FrameLayout>
  • Не забыть указать им строго заданные id:
  • Если вам надо получить доступ к одной из ActionView внутри вашего Activity/Fragment, то вы можете сделать это
    • через import с заменой имени, если вы используете kotlin-android-extensions:
      import kotlinx.android.synthetic.main.fr_gifts.contentView as recyclerView
    • через переменные(они проинициализированы в ActionsActivity/ActionsFragment): contentActionView, loadingActionView, noInternetActionView, emptyContentActionView, errorActionView
      При использовании данного способа, сейчас нет возможности изменить название переменных. Если у вас есть предложения, как это сделать - буду рад выслушать.
  • Добавить .withActionViews(view: ActionsView) в ваш rx-поток:
dataRepository.getAll()
    .withActionViews(view)
    .execute({
        view.setData(it)
        isContentEmpty.value = it.isEmpty()
    })

Эти действия могут показаться сложными, но как показывает практика, для своего проекта вы сделаете это один раз, а дальше просто будете использовать данный механизм.

Другой вариант использования ActionViews

  • Вы можете отказаться от наследования ActionsActivity/ActionsFragment
  • Вы все равно должны наследовать интерфейс ActionsView в вашей View, которую реализует Activity/Fragment.
  • Вы должны проинициализировать ваши ActionViews, также как это сделано в ActionsActivity/ActionsFragment

В чем плюсы от использования такого способа?

  • Вы избавляетесь от строго заданных id для ActionViews и можете использовать абсолютно любые

В чем минусы от использования такого способа?

Более глубокое использование библиотеки

FAQ

Мне надоело каждый раз добавлять одну и ту же реализацию NoInternetView/EmptyContentView/... в layout. Что делать?

Удобный способ добавления ActionView в layout

Что делать, если у меня несколько ActionView одинакового типа на одном экране?

Использование нескольких ActionView одинакового типа на одном экране

Что делать, если мне не подходит базовое поведение и я хочу использовать свое?

Кастомное поведение

Моя Activity/Fragment наследуется от базового класса, который я не могу изменить. Как добавить наследование от ActionsActivity/ActionsFragment?

Тогда вы можете просто скопировать код ActionsActivity или ActionsFragment и создать необходимый класс руками

Что делать, если я хочу добавить свой тип ActionView?

А оно вам надо? Разве данных типов ActionView недостаточно? Если нет, то посмотрите исходные коды на примере LoadingView, где она используется, как с ней работать и сделайте тоже самое.

Лицензии

MIT License

Copyright (c) 2018 Marat Tanchuev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

About

Данная библиотека избавит вас от boilerplate-кода и автоматизирует показ и скрытие: ContentView, LoadingView, NoInternetView, EmptyContentView, ErrorView

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages