Страница 1 из 1

Перелистывание календаря

Добавлено: 21 авг 2012, 06:36
neoksi
Привет, всем!

Я сейчас занимаюсь реализацией календаря и столкнулся со следующей проблемой, касающейся реализации смены месяца при помощи слайдинга. Ведь пользователю должно быть удобно :)

После проб разных реализаций слайдинга, я понял, что лучше всего использовать ViewPager. Но по дефолту он не поддерживает отображение страниц по кругу.
На просторах сети я нашел вроде реализации этого вот тут и тут. Но так как тут только участки кода, я не совсем понимаю, как мне их задействовать в своей реализации, помогите разобраться.

Реализую все 3мя View содержащими:
1) Выбранный месяц
2) Предыдущий месяц
3) Следующий месяц
При смене выбранного месяца, один из View перерисовывается.

Re: Перелистывание календаря

Добавлено: 21 авг 2012, 11:47
KamiSempai
Во второй ссылке показывают полноценную программу в которой используется этот механизм.
Принцип примерно в следующем:
Есть 3 страницы с объектом MonthView. Отображается средняя страница с выбранным месяцем. При перелистывании во всех MonthView месяц сдвигается и активной снова становится средняя страница. Таким образом создается иллюзия перелистывания.

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 12:11
neoksi
KamiSempai, огромное спасибо! Теперь я понял, что они называли магией =)

П.С. Собираюсь сделать ещё индикатор перелистывания, так что придется мне сделать 5 View месяцев.

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 12:45
KamiSempai
Не понял... Зачем 5? Что значит индикатор перелистывания?

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 13:00
neoksi
KamiSempai писал(а):Не понял... Зачем 5? Что значит индикатор перелистывания?
Для отображения текущего месяца я использую компонент com.viewpagerindicator.TitlePageIndicator
Посередине он отображает текущий месяц, слева возможность выбрать предыдущий, а справа следующий. Чтоб на нем отобразить такую же магию, как у ViewPager, нужно в памяти держать 5 View, так как за раз, он отображает одновременно информацию заголовка из 3х View.

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 13:16
KamiSempai
Не знаю как работает TitlePageIndicator, не работал с ним, так как в последних версиях support.v4 уже есть подобные индикаторы и я использую их.
Точно знаю, им хватит 3 View. Называются PagerTitleStrip и PagerTabStrip.

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 14:02
neoksi
KamiSempai писал(а):Не знаю как работает TitlePageIndicator, не работал с ним, так как в последних версиях support.v4 уже есть подобные индикаторы и я использую их.
Точно знаю, им хватит 3 View. Называются PagerTitleStrip и PagerTabStrip.
TitlePageIndicator - его можно установить в любом месте и он просто цепляется к ViewPager и читает Тег из отображаемого View.

Я уже написал код и он работает супер, но столкнулся с тем, что высота ViewPager не устанавливается по высоте содержимого View, в xml я указываю следующее:

Код: Выделить всё

    <android.support.v4.view.ViewPager
        android:id="@+id/cal_body_pager_row"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        />
Но строка android:layout_height="wrap_content" не срабатывает и ViewPager растягивается на всю возможную высоту =(

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 14:29
neoksi
neoksi писал(а): Но строка android:layout_height="wrap_content" не срабатывает и ViewPager растягивается на всю возможную высоту =(
На сколько я понял ViewPager не поддерживает wrap_content и ему нужно изменять размер вручную, в коде. Только я не совсем понял как мне реализовать в данном случае...

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 14:34
math64
У тебя задаётся одновременно и вес, и wrap_content. Нужно что-то одно.
Если нужно вычисление высоты по своему алгоритму - делай производный класс и переопределяй метод onMesure().

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 14:39
neoksi
math64 писал(а):У тебя задаётся одновременно и вес, и wrap_content. Нужно что-то одно.
Если нужно вычисление высоты по своему алгоритму - делай производный класс и переопределяй метод onMesure().
Даже убирая вес wrap_content не срабатывает, так как просто ViewPager его не поддерживает, решил особо не заморачиваться, так в месяце максимум может быть 6 строк с днями, то делаю статичный максимальный размер.

Re: Перелистывание календаря

Добавлено: 22 авг 2012, 15:48
neoksi
KamiSempai писал(а):Не знаю как работает TitlePageIndicator, не работал с ним, так как в последних версиях support.v4 уже есть подобные индикаторы и я использую их.
Точно знаю, им хватит 3 View. Называются PagerTitleStrip и PagerTabStrip.
KamiSempai, ты был прав, 3 View полностью хватит. Перечитал код программы примера и увидел, что там тоже используется TitlePageIndicator, как и у меня, и вся магия делается через OnPageChangeListener индикатора. :D