Одна активність та всі інші фрагменти [закрито]


158

Я думаю про реалізацію одного екрана з Activityта всіх інших sreens з Fragmentsта managing all the fragments thru the activity.

Це гарна ідея? і моя відповідь НІ, але все ж я хочу більш чітко дізнатися про цю думку.

Які плюси і мінуси ідеї?

Примітка:

Будь ласка, не дайте мені посилання на фрагмент та активність.

Редагувати:

Ось щось над фрагментами та активністю:

Плюси:

  1. Фрагменти призначені для використання з діяльністю як суб-активністю.
  2. Фрагменти не є заміною діяльності.
  3. Фрагменти призначені для повторного використання (Потрібно знати, яким чином можна досягти повторного використання.)
  4. Фрагменти - найкращий спосіб написання коду для підтримки як планшетів, так і телефонів.

Мінуси:

  1. Нам потрібно реалізувати інтерфейс, щоб отримати дані з фрагментів.
  2. Для діалогу нам потрібно пройти довгий шлях, щоб його показати.

Чому ми повинні використовувати фрагменти, якщо ми не розглядаємо таблетки? Яка різниця в часі між активністю та фрагментом?


Чи можете ви детальніше пояснити, чому ви вважаєте, що відповідь - ні? Я не погоджуюся, але простіше вирішити проблеми, які можуть виникнути у зв'язку з цим підходом, якщо ми знаємо, що це за проблеми.
Олександр Лукас

1
@AlexanderLucas Відповідь, яку я не відповів, тому що робить ваш код менш модульним, збільшує складність.
Vineet Shukla

@Ski Ви більше зосереджуєтесь на тому, щоб прийняти свою відповідь, плот зосередьтесь на тому, що вам задають питання, і що має бути найкращим варіантом відповіді, який ви можете надати.
Vineet Shukla

3
Для всіх, хто це виявив, я зупинив рефактор, тому що все справді склалося дуже швидко.
theblang

18
Це хороше питання, і його не слід було закривати.
Джим у Техасі

Відповіді:


94

Це залежить від програми, яку ви створюєте. Я створив кілька додатків, використовуючи обидва підходи, і не можу сказати, що один спосіб завжди кращий за інший. В останньому створеному нами додатку я використовував єдиний Activityпідхід та навігацію у стилі Facebook. Вибираючи елементи зі списку навігації, я оновлюю один Fragmentконтейнер для відображення цього розділу.

Зауваживши, що сингл Activityтакож створює багато складностей. Скажімо, у вас є форма редагування, а для деяких елементів, які користувач повинен вибрати або створити, вимагає, щоб вони перейшли на новий екран. За допомогою заходів ми просто зателефонуємо на новий екран, startActivityForResultале Fragmentsнемає такого, щоб ви в кінцевому підсумку зберігали значення на Activityта, маючи головний фрагмент редагування, перевіряли, Activityчи дані вибрані та чи повинні відображатися користувачеві.

Те, що говорить Аравінд про приєднання до одного Activityтипу, також є правдою, але насправді не обмежує. Ваша діяльність буде FragmentActivity і до тих пір, поки вам не потрібна MapViewреальна обмеженість. Якщо ви хочете відображати карти, це може бути зроблено, але вам потрібно буде або змінити бібліотеку сумісності Android для FragmentActivityрозширення, MapActivityабо використовувати загальнодоступні програми Android-support-v4-googlemaps .

У кінцевому рахунку більшість розробників, яких я знаю, що пішли одним Activityмаршрутом, повернулися до кількох заходів, щоб спростити свій код. Інтерфейс, розумний, на планшеті ви кілька разів зациклюєтесь на використанні єдиного, Activityщоб досягти того, що коли-небудь шалена взаємодія ваших дизайнерів придумала :)

- EDIT -

Нарешті, Google вийшов MapFragmentу бібліотеку сумісності, тому вам більше не доведеться використовувати хак для android-support-v4-googlemaps. Про оновлення читайте тут: API Google Maps Android v2

- EDIT 2 -

Я просто прочитав цей чудовий пост про сучасний (2017) стан фрагментів і згадав цю стару відповідь. Думав, що я поділюсь: Фрагменти: рішення всіх проблем Android


6
Там settargetfragmentі ви могли б впоратися з такою діяльністю, як startforresultпроцедура.
Lalith B

1
На мою думку, діяльність існує лише тому, що це стара система. Фрагмент раніше не існував. Дійсно, нічого, що може, і фрагменти не можуть, крім формальності. Я навіть міг уявити, що в якийсь момент діяльність видаляється і все є фрагментом.
Ixx

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

85

Я збираюся закінчити проект (5 місяців у розробці), який має 1 активність та 17 фрагментів, весь на весь екран. Це мій другий фрагментний проект (попередній - 4 місяці).

Плюси

  • Основний вид діяльності - 700 рядків коду, просто красиво керуючи порядком навігації по фрагментах.
  • Кожен фрагмент добре розділений на власний клас і є відносно невеликим (~ пару сотень рядків інтерфейсу).
  • Керівництво може сказати: "Ей, як щодо того, як ми змінюємо порядок цих екранів", і я можу це зробити дуже легко, оскільки ці фрагменти не залежать один від одного, всі вони спілкуються через діяльність. Мені не доводиться копатись окремими видами діяльності, щоб знайти, куди вони дзвонять один одному.
  • мій додаток дуже важкий для графіки, і ніколи не працюватиме як 1 екран 1 діяльність. Усі ці додаткові дії в пам'яті змушували б додаток постійно вичерпати пам'ять, тому я повинен був би виконувати finish()всі видимі види діяльності та вносити ту саму логіку управління для навігації, як і з фрагментами. Можна також зробити це з фрагментами саме через це.
  • якщо ми коли-небудь зробимо додаток для планшетів, у нас буде простіший час ре-факторингу, тому що все вже добре розділено.

Мінуси

  • ви повинні навчитися використовувати фрагменти

1
не був упевнений у тому, що маєш занадто багато фрагментів, і лише зараз активність ... будь-які проблеми з виробництвом, і вина на тебе !! :)
Шахар

1
@Dinash не дозволяють ОС відновити вашу діяльність. впорайтеся із зміною орієнтації самостійно. докладніше читайте тут: stackoverflow.com/questions/5913130/…
Тамас

1
@Tamas Чи були у вас мультифрагментні екрани (наприклад, майстер-деталь), і якщо так, як ви це впоралися?
theblang

7
@Tamas Цей підхід сильно протидіє андроїд. Ви закінчуєте клас БОГ. Система Android розроблена для роботи з діяльністю - наприклад, у вас немає приємного способу обробки панелей інструментів у кількох фрагментах. У вас немає початкового фрагмента для результату, і багато інших не мають. Це означає, що вам доведеться переписати всю логіку, яка вже є. Як щодо місцевих приймачів, служб та інших компонентів для Android. Для того, щоб запустити послугу, ви повинні зробити наступне: getActivity ()! = Null ... це справді некрасиво. Також спілкування між фрагментами дуже дивно, якщо у вас багато фр.
Теодор

9
700 рядків !!!! "приємно" ???? Заняття безкоштовні.
беплая

16

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

Що насправді забезпечують діяльність та фрагменти?

  1. Події з життєвого циклу та backstack
  2. Контекст і ресурси

Тому використовуйте їх для цього, ТІЛЬКИ . Вони несуть достатню відповідальність, не надто ускладнюйте їх. Я можу стверджувати, що навіть інтанізація TextView у діяльності чи фрагменті є поганою практикою. Існує причина такої методи, як public View findViewById (int id) - ПУБЛІЧНІ .

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

Врешті-решт, ви могли б скласти власний задник та життєві цикли. Але, навіщо відтворювати колесо?

EDIT: Чому за це голосують? Люди з єдиною ціллю! Кожна активність або фрагмент повинен мати можливість створювати презентацію, який створює подання. Презентатор і перегляд - це модуль, який можна змінювати. Чому за діяльність або фрагмент повинен відповідати ведучий ??


Хм ... зв’язок між інстанціфікацією подання є поганою практикою та публікацією findViewById () незрозумілий. Хоча я погоджуюсь про інстанціювання поглядів, я також вважаю називати findViewById з іншого класу (наприклад, діяльність, що розміщує фрагмент, називає його на фрагменті) поганою практикою. Не знаю, чому це публічно, оскільки, принаймні, у тих випадках, коли я можу придумати, це призводить до безладного коду, а не до модульного дизайну.
Ixx

ІМХО: Якщо ви перейдете активність у свій погляд і презентатор (називаючи 2 комбіновані "модулем"), ви вимагаєте повторного використання цього модуля з іншими активами. Якщо це допомагає, то найкраще передати діяльність як внутрішню частину, яка викриває лише некрасиві шрифти. Якщо ви ненавидите знаходити погляди поза межами активності, то ви можете вводити всі перегляди за допомогою цього вкладеного файлу в прес-перегляд. Головний момент полягає в тому, що я вірю, що кодування Android повинно здійснюватися за межами концепції Actvities і Frags, тому що перемикання між двома є простим. код.
беплая

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

12

Плюси

Ви можете керувати своїми фрагментами за допомогою однієї діяльності, оскільки всі фрагменти не залежать один від одного. Фрагменти мають життєвий цикл ( onPause, onCreate, onStart...) свої власні. Маючи життєвий цикл, фрагменти можуть самостійно реагувати на події, зберігати їх стан onSaveInstanceStateі повертатись назад (тобто, наприклад, під час відновлення після вхідного дзвінка або коли користувач натискає кнопку назад).

Мінуси

  1. Створіть складність у своєму коді діяльності.
  2. Ви повинні керувати порядком фрагментів.

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


2

Це залежить від дизайнерського макета вашої програми. Припустимо, якщо ви використовуєте Tabs у ActionBar у дизайнерському макеті, то в Single Activity додатку можна змінити фрагменти, що змінюються при натисканні Tab. Отже, тепер у вас є активність і скажіть, припустимо, три вкладки в панелі ActionBar і вигляд вкладок, які надаються фрагментами, що дозволяє легко керувати плюсом, також можливо. Отже, все залежить від схеми дизайну вашого додатка і того, як ви приймаєте рішення для його створення.


1

Плюси:

  • Може використовуватися для створення єдиного інтерфейсу, який може бути використаний у кількох розмірах та орієнтаціях екрана через макети xml.

Мінуси:

  • Потрібен більш складний код у вашій діяльності.

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


Для орієнтації не потрібно використовувати різні макети на основі xml.
Vineet Shukla

@VineetShukla правда, але це варіант, як і використання різних макетів xml залежно від розміру екрана. Наприклад, головний екран мого телефону Android має інший макет, коли я переглядаю його в альбомній орієнтації та портретній.
Лижний спорт

0

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

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


"Я думаю, що погана ідея, щоб впровадження телефону довелося переходити на одну посадкову діяльність, коли вводиться вкладки чи меню висувань, оскільки навігація по вкладках чи меню просто призводить до абсолютно нового екрану." -> Не зрозуміло, що саме ви маєте на увазі, але ні вкладки, ні бічне меню не є проблемою в програмі для одноразового використання (планшет / телефон).
Ixx

-1

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


4
Я не вірю, що це правда. З документації про життєвий цикл фрагмента ( developer.android.com/guide/components/fragments.html#Lifecycle ): "Життєвий цикл активності, в якій живе фрагмент, безпосередньо впливає на життєвий цикл фрагмента, таким чином, що кожен зворотний виклик життєвого циклу для активності призводить до аналогічного зворотного виклику для кожного фрагмента. Наприклад, коли активність отримує OnPause (), кожен фрагмент в активності отримує onPause (). "
Лижі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.