В данном issue будут описаны предложения/исследования фичи кастомизации сторисов.
Сначала нужно определиться с необходимыми вьюхами у сториса.
Для этого, ниже приведены иерархия вьюх в уже готовых лэйаутах.
- Сторис StoryFragment:
- Прогресс бар сториса (StoriesProgressView)
- Кнопка закрытия (ImageView/Button)
- Фрейм истории (StoryFrameView)
Фрейм сториса StoryFrameView:
- Картинку фрейма (ImageView)
- Контент фрейма (StoryFrameContentView)
- Прогресс бар загрузки фрейма (ProgressBar)
- Лэйаут ошибки (View) - кнопка перезагрузки, обязателен коллбек onRefresh
Контент фрейма StoryFrameContentView:
- Заголовок (TextView)
- Подзаголовок (TextView)
- Подробное описание (TextView)
- Кнопка действия (Button) - должен быть onClick
Следовательно, у сториса следующие основные элементы:
- Прогресс бар
- Картинка фрейма
- Текст фрейма (заголовок, подзаголовок, подробнее)
- Кнопка фрейма (обработка юрла по клику)
- Вью ошибки
Нужно добавить возможность замены имеющихся лэйаутов сторисов/фреймов/контента на свой собственный.
Другой вопрос - как вставить собственные лэйауты в StoryFragment.
Как вариант, можно передавать в конструктор StoryFragment указанные выше вьюхи. К примеру:
class StoryFragment : Fragment(), StoryListener {
companion object {
fun newInstance(story: Story, views: StoryViews): Fragment {
...
return StoryFragment()
}
}
}
// Все основные элементы сториса
data class StoryViews(
val progressBar: StoriesProgressView,
val image: ImageView,
val title: TextView,
val subTitle: TextView,
val description: TextView,
val button: Button?,
val errorView: View
)
Довольно простой способ, но тогда не получится управлять расположением элементов.
По-хорошему, надо передавать именно R.layout.my_layout, но тогда, скорее всего, придется проверять наличие всех элементов в рантайме и выкидывать эксепшн при отсутствии.
Если ничего не пропускаю, реализация коллбэков типа нажатия кнопки сторисов уже реализована (добавлять кастомизацию и для этого было бы еще труднее), поэтому надо сначала решить с вьюхами.
Следующий вопрос - когда добавлять кастомные вьюхи.
StoryFragment создается в FragmentAdapter-е, так что, скорее всего, вьюхи/лэйаут надо передать именно в него.
В итоге, нужно подумать о следующих моментах:
- Как добавлять кастомные вьюхи - передавать инстансы в конструктор или передавать лэйаут? Во втором случае, как создать контракт о необходимых вью?
- Когда совершить замену вьюх на кастомные? Скорее всего, передачу можно делать при инициализации либы, а эти вьюхи/лэйаут будут передаваться при создании фрагмента (в fragment adapter).
- Надо определиться с максимальным минимумом необходимых вьюх. Потенциально, могут не понадобиться заголовки сторисов, соответственно, и в лэйауте вьюхи с текстом требовать не надо.