Трохи про Fragment
Fragment — модульна частина activity, яка має свій життєвий цикл і свої обробники різних подій. Android додав фрагменти з API 11, для того, щоб розробники могли розробляти більш гнучкі інтерфейси користувача на великих екранах, таких як екрани планшетів. Через деякий час було написано бібліотеку, яка додає підтримку фрагментів у більш старі версії.
Плюси в порівнянні з використанням діяльності видно відразу:
- За допомогою них можна легко зробити адаптивний дизайн під планшети.
- Поділ коду на функціональні модулі, а отже підтримка коду коштує дешевше
Основні класи
Є три основні класи:android.app.Fragment- від нього, власне кажучи. і будуть успадковуватись наші фрагментиandroid.app.FragmentManager— за допомогою екземпляра цього класу відбувається вся взаємодія між фрагментамиandroid.app.FragmentTransaction— ну і цей клас, як відомо за назвою, необхідний здійснення транзакцій. В даний час з'являються різновиди класу Fragment, для вирішення певних завдань - ListFragment, PreferenceFragment та ін.
Основи роботи з fragment'ами
Щоб створити фрагмент все, що потрібно це успадкувати свій клас від Fragment. Щоб прив'язати фрагмент до певної розмітки, потрібно визначити в ньому метод onCreateView(). Цей метод повертає View, якому належить ваш фрагмент.
Щоб отримати це View з будь-якого місця фрагмента, достатньо викликатиgetView()
Фрагмент ми створили, але хотілося б розмістити його на екрані. Для цього нам потрібно отримати екземпляр FragmentManager і здійснити потрібну нам транзакцію. Спочатку потрібно дізнатися, що ми з фрагментом можемо зробити:add()— додаванняфрагментаremove()- видалення фрагментаreplace()- заміна фрагментаhide()- робить фрагмент невидимимshow()- відображає фрагмент
Так само для того, щоб додавати наші транзакції в стек, як це відбувається за умовчанням з активностями, можна використовуватиaddToBackStack(String), а щоб повернути попередній стан стеку потрібно викликати методpopBackStack().
Додамо фрагмент на екран:
Як пов'язати activity та fragment?
Щоб викликати методи активіті, достатньо одержати його екземпляр через методgetActivity()
Якщо нам потрібно обробляти події фрагмента з активіті, то найкраще рішення це активити реалізувати інтерфейс і у фрагменті намагатися привести батьківське активіті до об'єкта цього інтерфейсу.
- серіалізувати об'єкт
- передати об'єкт у контейнері Parcel, перевизначивши методи Parcable
- Де-не-де бачив, що для створення фрагмента через перевизначений конструктор, створюють статичний фабричний метод
Покажу як це робиться для другого варіанта, тому що для android більш правильно використовувати Parcel для передачі параметрів між активностями та фрагментами.
Тут ми реалізували інтерфейс Parcelable у класі, який хочемо передавати між фрагментами. Щоб передати його у фрагмент потрібно зробити таке:
Далі потрібно лише отримати переданий нами об'єкт у методіonCreateView()нового фрагмента:
UPD.виправив отримання об'єкта obj з gerArguments(), дякую firexel
Анімація фрагментів
Ми навчилися створювати фрагменти, здійснювати дії над ними, взаємодіяти з активіті та з активіті, але щоб усе це виглядало представницько, фрагменти можна трохипожвавити, додавши до них анімації.
Щоб створити свою анімацію додавання та видалення фрагмента? потрібно створити два файли в директорії res/animator, один буде служити для анімації додавання, другий для видалення
Наведу приклад одного з них:
Кореневим елементом служить об'єктааніматора, його атрибути і задають параметри анімації. Тепер нам потрібно викликати методsetCustomAnimations()з нашими анімаціями і за наступної транзакції наші фрагменти оживуть.
Багато ще можна говорити про фрагменти, хоча більшість вже написана, я ж хотів об'єднати всі основні знання про фрагменти, щоб людина, яка нічого не знає про цей елемент, після прочитання стала вільно ними користуватися.