Чому фрагменти, і коли використовувати фрагменти замість діяльності?


484

В Android API 11+ Google випустив новий клас під назвою Fragment .

У відео, Google передбачає , що всякий раз , коли це можливо ( link1 , link2 ), ми повинні використовувати фрагменти замість діяльності, але вони не пояснюють , чому саме.

Яка мета фрагментів та деякі можливі можливості їх використання (крім деяких прикладів інтерфейсу, які можна легко досягти простими переглядами / макетами)?

Моє запитання щодо фрагментів:

  1. Які цілі використання фрагмента?
  2. Які переваги та недоліки використання фрагментів порівняно з використанням діяльності / поглядів / макетів?

Питання про бонус:

  1. Чи можете ви дати якісь цікаві варіанти використання фрагментів? Те, про що Google не згадував у своїх відео?
  2. Який найкращий спосіб спілкуватися між фрагментами та діями, які їх містять?
  3. Які найважливіші речі слід пам’ятати, використовуючи фрагменти? Якісь поради та застереження з вашого досвіду?


Відповіді:


282

№1 та №2, які цілі використання фрагмента та які переваги та недоліки використання фрагментів у порівнянні з використанням діяльності / поглядів / макетів?

Фрагменти є рішенням Android для створення інтерфейсів для багаторазового використання. Ви можете досягти одних і тих же речей, використовуючи дії та макети (наприклад, використовуючи включає). Однак; фрагменти підключені до Android API, від HoneyComb і вище. Дозвольте мені детальніше;

  • The ActionBar. Якщо ви хочете, щоб вкладки там були для навігації у вашому додатку, ви швидко бачите, що ActionBar.TabListenerінтерфейс дає вам FragmentTransactionв якості аргументу введення onTabSelectedметоду. Можливо, ви могли б проігнорувати це та зробити щось інше та розумне, але ви працювали б проти API, а не з ним.

  • FragmentManagerРучками «назад» для вас в дуже розумним способом. Назад не означає повернення до останнього заняття, як для регулярних занять. Це означає повернення до попереднього стану фрагмента.

  • Ви можете використовувати клавішу cool ViewPagerіз a, FragmentPagerAdapterщоб створити інтерфейс для розгортання. FragmentPagerAdapterКод набагато чистіше , ніж звичайний адаптер, і він контролює інстанціацій окремих фрагментів.

  • Твоє життя стане набагато простішим, якщо ти будеш використовувати Фрагменти, коли намагатимешся створювати програми як для телефонів, так і для планшетів. Оскільки фрагменти настільки пов'язані з API Honeycomb +, ви хочете використовувати їх на телефонах, а також для повторного використання коду. Ось тут корисна бібліотека сумісності.

  • Ви навіть можете і повинні використовувати фрагменти для додатків, призначених лише для телефонів. Якщо ви маєте на увазі портативність. Я використовую ActionBarSherlockбібліотеки сумісності для створення програм "ICS looking", які виглядають однаково до версії 1.6. Ви отримуєте найновіші функції, такі як ActionBar: вкладки, переповнення, панель розділених дій, панель перегляду тощо.

Бонус 2

Найкращий спосіб спілкування між фрагментами - це наміри. Коли ви натискаєте щось у фрагменті, ви зазвичай телефонуєте StartActivity()з даними про нього. Намір передається всім фрагментам запущеної діяльності.


5
Перш за все, дякую. Я ціную людей, які дають інформативні (але короткі) відповіді, а не просто дають мені посилання на посібник. У будь-якому разі, крім додаткових функцій для роботи на спеціальних класах, можна подумати про переваги та недоліки роботи з фрагментами ?
андроїд розробник

4
Я думаю, що ви повинні бути більш прямими у ваших питаннях. Я щойно дав чотири основні переваги.
Гленн Бех

2
добре, а як щодо недоліків у порівнянні з налаштованими видами та діями?
андроїд розробник

2
як ви спілкуєтеся між фрагментами за допомогою намірів? чи всі фрагменти повинні бути "живими" (додані до діяльності), щоб вони могли спілкуватися один з одним?
андроїд розробник

55
Один фрагмент ніколи не повинен говорити безпосередньо з іншим фрагментом - замість цього пройти батьківську діяльність. Таким чином, ви не закінчите спагеті-кодом, але простий в управлінні кодом.
слот

70

Не впевнений, на яке відео ви посилаєтесь, але я сумніваюся, що вони говорять, що ви повинні використовувати фрагменти замість діяльності, оскільки вони не є взаємозамінними. Насправді є досить детальний запис у посібнику Dev, врахуйте, читай його детально.

Коротше кажучи, фрагменти живуть всередині діяльності, і кожна діяльність може містити багато фрагментів. Як і діяльність, вони мають певний життєвий цикл, на відміну від видів діяльності, вони не є компонентами додатків найвищого рівня. Переваги фрагментів включають повторне використання коду та модульність (наприклад, використання одного і того ж подання списку в багатьох видах діяльності), включаючи можливість побудови багатопанельних інтерфейсів (в основному корисних для планшетів). Основним недоліком є ​​(деяка) додаткова складність. Як правило, те саме можна досягти і з (користувацькими) переглядами нестандартним та менш надійним способом.


1
оновлене питання. тепер він має посилання на відео з google. також, дякую за пояснення, але мені все одно потрібно роз’яснення щодо мого питання.
андроїд розробник

5
Прочитайте запис у посібнику розробників, у ньому є більш ніж достатньо деталей. Навряд чи ви отримаєте відповідь на "круті використання фрагментів" на SO - шлях до розпливчастості, і немає однозначної відповіді. На номер 4 конкретно відповідає відповідь у посібнику розробників-- developer.android.com/guide/topics/fundamentals/…
Микола Єленков

1
наскільки мені відомо, цей метод створює залежність, яка діяльність може містити який фрагмент. також, будь ласка, дайте відповідь на основні запитання (перші два).
андроїд розробник

3
Дякуємо розробнику Android для наполягання на відповідях на основне питання. У банкоматі я не бачив нічого корисного для мене в класі Fragment за допомогою використання тегу XML "include". Типи речей, які мені здадуться цінними, - це можливість вказати один макет, який магічно перетворився б на найкращий досвід користувачів при будь-яких резолюціях. З того, що я можу вам сказати, все ще потрібно зробити це в коді самостійно. Іншим потенційним значенням буде спосіб поєднання коду + ресурсів у багаторазові компоненти, які не зустрічаються у додатках для повторного використання, але, схоже, вони там не є. Я хочу однієї справді вагомої причини.
Мелінда Грін

2
Я починаю розуміти те, як Google пропонує використовувати фрагменти, але я цілком погоджуюся з @NikolayElenkov .. Мені користування видами діяльності все ще здається найбільш надійним і менш складним способом ..
andrea.rinaldi

49

Фрагмент - це фрагмент користувальницького інтерфейсу програми або поведінки, який може бути розміщений у діяльності, яка дозволяє більш модульний дизайн діяльності. Не буде помилятися, якщо ми скажемо, що фрагмент є різновидом субактивності.

Нижче наведено важливі моменти щодо фрагмента:

  1. Фрагмент має власну компоновку та власну поведінку із власними зворотними дзвінками життєвого циклу.

  2. Ви можете додавати або видаляти фрагменти в активності під час активності.

  3. Ви можете об'єднати кілька фрагментів в одній діяльності, щоб створити інтерфейс з декількома панелями.

  4. Фрагмент можна використовувати в декількох заходах.

  5. Життєвий цикл фрагмента тісно пов'язаний з життєвим циклом його діяльності.

  6. Коли діяльність призупинена, усі фрагменти, доступні в активі, також будуть зупинені.

  7. Фрагмент може реалізувати поведінку, яка не має компонента інтерфейсу користувача.

  8. Фрагменти були додані до Android API в Android 3 (Honeycomb) з API версії 11.

Для більш детальної інформації відвідайте офіційний сайт, фрагменти .


1. Як ви вже згадували на №8, він не повинен мати макет. 6. ви пропустили частину після "засобів". У будь-якому випадку, дякую за те, що допомагаєте іншим зробити це зрозумілішим. Я дам вам +1.
андроїд розробник

1
Щодо №8, можливим прикладом фрагмента без макета (тобто фрагмента без голови) може бути те, що виконує завдання, яке незважаючи на дещо короткий (наприклад, короткий HTTP-запит), все ще потрібно, щоб пережити зміни конфігурації, і, отже, залежить на точний екземпляр фрагмента, який зберігається поперек них (використовуючи setRetainInstance (true) на фрагменті). Що стосується фрагментів компонування, setRetainInstance (true) не має особливого сенсу, оскільки заважає ресурсам, пов'язаним з їх переглядами, звільнятися при необхідності (тобто витоку пам'яті).
Піовезан

ПРИМІТКА: "# 8" зараз "№7".
ToolmakerSteve

21

Це важлива інформація, яку я знайшов на фрагментах:

Історично кожен екран у додатку для Android реалізовувався як окрема діяльність. Це створює виклик при передачі інформації між екранами, оскільки механізм наміру Android не дозволяє передавати тип посилання (тобто об'єкт) безпосередньо між видами діяльності. Натомість об'єкт повинен бути серіалізований або доступний у всьому світі доступний довідник.

Зробивши кожен екран окремим фрагментом, ці дані, що передають головний біль, повністю уникають. Фрагменти завжди існують у контексті певної діяльності та завжди можуть отримати доступ до цієї діяльності. Зберігаючи цікаву інформацію в межах діяльності, Фрагмент для кожного екрану може просто отримати доступ до посилання на об'єкт через Діяльність.

Джерело: https://www.pluralsight.com/blog/software-development/android-fragments


3
Це правда, але для цього є рішення: використовуйте Parcelable, коли це не величезний об'єкт (і для його спрощення є плагін), а якщо це величезний об'єкт, ви завжди можете використовувати статичну посилання, яка буде встановлена ​​на нуль коли ви переходите до нової діяльності (або коли ви знищуєте її, залежно від вашої потреби).
андроїд розробник

@androiddeveloper: "використання Parcelable" відповідає моєму визначенню "головний біль, що передає дані, уникнути використання фрагментів". Якщо є складний загальний стан, який повинен зберігатися, поки проходить серія екранів, Діяльність + Фрагменти є хорошим рішенням, IMHO. (Хоча я відмовився від заднього стека «Фрагмент» і зробив власне управління тим, що означає «назад».)
ToolmakerSteve

Використання структури дизайну інтерфейсу між фрагментами через активність контейнера - це набагато модульний підхід для передачі не лише об'єктів, а й натискання слухачів подій та аргументів методу назад до інших фрагментів або до основної діяльності контейнера.
Kaveesh Kanwal

10

Діяльність - це компоненти на повноекранному екрані в додатку з панеллю інструментів, все інше бажано - фрагменти. Повноекранна батьківська діяльність на панелі інструментів може мати декілька панелей, прокручуваних сторінок, діалогових вікон тощо (усі фрагменти), всі з яких можна отримати з батьків і спілкуватися через батьківський.

Приклад:

Діяльність А, Діяльність В, Діяльність С:

  • Усі дії повинні повторювати один і той же код, щоб, наприклад, показати основну панель інструментів, або успадкувати від батьківської діяльності (стає громіздкою для управління).
  • Щоб перейти від однієї діяльності до іншої, або всі вони повинні бути в пам'яті (накладні витрати), або їх потрібно знищити, щоб відкрити інший.
  • Спілкування між видами діяльності може здійснюватися через Інтенти.

проти

Діяльність А, Фрагмент 1, Фрагмент 2, Фрагмент 3:

  • Немає повторення коду, на всіх екранах є панелі інструментів тощо від цієї однієї діяльності.
  • Кілька способів переміщення від одного фрагмента до іншого - перегляд пейджера, мультипанелі тощо.
  • Діяльність має більшість даних, тому потрібне мінімальне між фрагментарне спілкування. Якщо все-таки необхідно, це можна зробити легко через інтерфейси.
  • Фрагменти не потребують повноекранного режиму, багато гнучкості в їх розробці.
  • Фрагменти не потрібно надувати макет, якщо перегляди не потрібні.
  • У кількох заходах можна використовувати один і той же фрагмент.

ідеальна відповідь!
Сатеш

8

Фрагменти є особливо корисними в деяких випадках, наприклад, коли ми хочемо зберегти навігаційну скриньку на всіх наших сторінках. Ви можете надути макет кадру будь-яким фрагментом, який хочете, і все ще мати доступ до навігаційного ящика.

Якби ви використовували діяльність, вам довелося б тримати ящик у всіх видах діяльності, що спричиняє надмірний код. Це одне цікаве використання фрагмента.

Я новачок в Android і досі вважаю, що фрагмент корисний таким чином.


Так. Однак мене все ще іноді бентежить правильний спосіб використання фрагментів, і це через складний життєвий цикл як фрагментів, так і діяльності.
андроїд розробник

@androiddeveloper Ви просто в основному використовуєте діяльність?
Майкл Алан Хафф

@MichaelAlanHuff Підтримуючи планшети, я думаю, що краще використовувати фрагменти. Також, підтримуючи зміни орієнтації та інші подібні події, ви можете скористатися DialogFragment, оскільки він дозволяє відновити їх
андроїд розробник

@androiddeveloper, це теж я думаю. Я не використовував DialogFragments так часто. Щоб допомогти модульності логіки, багато розробників андроїдів починають використовувати власні представлення, щоб утримувати логічний розчин у ступці. Ось недавня розмова про власні погляди, яку висловив
Майкл Алан Хафф

@MichaelAlanHuff використання фрагментів також може бути корисним, якщо ви думаєте, що поточний екран може бути частиною іншого екрану.
андроїд розробник

5

Я знаю, що про це вже йшлося до смерті, але я хотів би додати ще кілька пунктів:

  • Фраги можна використовувати для заповнення Menus та MenuItemсамостійно обробляти кліки. Таким чином, надаються нові варіанти модуляції для вашої діяльності. Ви можете робити ContextualActionBar і так далі, не знаючи про це свою активність, і, в основному, можна від'єднати її від основного матеріалу, який обробляє діяльність (навігація / налаштування / про)

  • Батьківський Frag з дочірніми Frags може дати вам додаткові варіанти модифікації ваших компонентів. Наприклад, ви можете легко поміняти Frags навколо, помістити нові Frags всередину пейджера або вийняти їх, переставити їх. Усі без вашої діяльності нічого про це не знають, просто зосередившись на матеріалах вищого рівня.


0

Фрагменти живуть у межах діяльності та мають:

  • власний життєвий цикл
  • власний макет
  • власні дочірні фрагменти тощо.

Розгляньте фрагменти як суб-діяльність основної діяльності, до якої належить, вона не може існувати самостійно і її можна називати / повторно використовувати знову і знову. Сподіваюся, це допомагає :)


Власне, щодо другого пункту ("власний макет") це необов'язково. Фрагмент взагалі не повинен мати перегляд.
андроїд розробник

0

1.Меть використовувати фрагмент?

  • Відповідь:
    1. Справа з відмінностями форм-фактора пристрою.
    2. Передача інформації між екранами додатків.
    3. Організація інтерфейсу користувача.
    4. Розширені метафори інтерфейсу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.