Как ViewPager, но ViewFlipper

Перехватывать открытие нового экрана в виджете ViewFlipper. Kotlin extensions, пацаны!

sashatinkoff
О разработке для Android
2 min readOct 14, 2019

--

Вот давайте не будем спрашивать “А зачем?”. Ситуации могут быть разными, и прелесть разработки вообще — это поиск решений может привести к разным вариантам с одним результатом — все работает так, как запланировано.

Итак, у виджета ViewPager есть прекрасный способ отслеживать момент, когда активная вьюшка (Fragment) меняется. Давайте напомню:

val viewpager = ViewPager(this)
viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {}

override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}

override fun onPageSelected(position: Int) {
Timber.i("Bingo position=$position")
}
})

С ViewFlipper дела обстоят немного по другому — решения “из коробки” нет. Как я писал выше, можно попробовать решить вопрос по разному, например установкой listener’а на анимацию (не пробовал, но пишут что так можно).

Мой вариант предлагает комбинацию из расширений (между нами — никогда так не говорю — только extensions). Кто не в курсе — это офигенная фишка, позволяющая расширить функционал любого объекта в вашем проекте, причем неважно, встроенный это объект, например Context или ваш собственный CustomModel, который вы по какой-то причине не хотите расширять в самом классе.

Короче, вот к чему все. Для нашего ViewFlipper создаем функцию

fun ViewFlipper.addOnChangeListener(onChange: (Int) -> Unit) {
addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
private var currentDisplayed = -1

override fun onLayoutChange(
v: View?,
left: Int,
top: Int,
right: Int,
bottom: Int,
oldLeft: Int,
oldTop: Int,
oldRight: Int,
oldBottom: Int
) {
if (currentDisplayed != displayedChild) {
onChange(displayedChild)
currentDisplayed = displayedChild
}
}
})
}

И в любом месте нашего проекта добавляем, где нам необходимо, этот вызов:

viewflipper.addOnChangeListener { Log.i("", "onPageChange $it") }

Этот же пример на моем Github

--

--

sashatinkoff
О разработке для Android

Пишу о разном с матом ем булку с маком никогда не бегал с автоматом