Фрагменти Android: Коли використовувати приховати / показати або додати / видалити / замінити?


117

Припустимо, я хочу замінити поточний фрагмент у деякому вигляді контейнера на інший. Чи краще використовувати заміну ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... або наступне, із показом та приховуванням?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

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


якщо я перейду до фрагмента B від фрагмента A, а потім повернеться до фрагмента A, як я можу переконатися, що подія життєвого циклу, така як onCreateView, не викликає фрагмент A? чи знайде фрагмент за тегом роботи?
blackHawk

Відповіді:


135

Ви повинні розглянути, що ви плануєте зробити з фрагментом, щоб вирішити, який шлях слід. Якщо ви використовуєте FragmentTransaction, щоб приховати фрагмент, він все ще може перебувати в робочому стані його життєвого циклу, але його інтерфейс відключений від вікна, тому його більше не видно. Тож ви могли технічно все-таки взаємодіяти з фрагментом і повторно приєднати його інтерфейс пізніше. Якщо ви заміните фрагмент, ви насправді витягуєте його з контейнера, і він пройде через усі події розриву в життєвому циклі (onPause, onStop тощо), і якщо з певних причин вам потрібен цей фрагмент знову, вам доведеться вставити його назад у контейнер і нехай він знову пройде всю його ініціалізацію.

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


5
Для наших потреб ініціалізація фрагмента є досить дорогою, тому ми, мабуть, підемо hide()і show()заощадимо на цьому! Дякую за це!
Роберт Карл

2
Привіт, коли ви скажете від'єднатись від вікна, ви маєте на увазі, що виклик onDetach () буде викликаний? Я експериментував з цим, схоже, це не так.
GingerJim

ймовірно, він мав на увазі "відсторонити"; фрагмент також можна від'єднати / приєднати (додатково додати / видалити, показати / приховати)
comeGetSome

1
@Zainodis, у мене теж проблема. Моє рішення - зберегти прихований стан фрагмента в onSaveInstanceState () - збереженийInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); тоді в onCreate (), якщо (збереженийInstanceState! = null) повертається прихований стан, а якщо фрагмент прихований, то приховайте його разом з транзакцією.
worawee.s

1
@ worawee.s Привіт, дякую за оновлення :)! Я вирішив проблему деякий час тому на своєму кінці - мені не дуже потрібно було ховати / показувати і т. Д., Тому я повністю відмовився від цього, і тепер я переходжу до таких стандартів, як додавання / заміна або одиночні фрагменти в одній панелі (в основному потоки деталей в основному) . Для тих, хто все ще використовує приховування, ваше рішення буде дуже корисним - і не перевірка збереженогоInstance! = Null була однією з помилок, які я робив раніше.
AgentKnopf

5

Ви в основному відповіли самі. Якщо ви хочете замінити (такий старий фрагмент більше не потрібен), скористайтеся, replace()якщо ви хочете тимчасово приховати його, тоді зробіть hide().


В основному заміняє doesAllAll. Я не зміг знайти відповідне сховане все :(
AlikElzin-kilaka

@ AlikElzin-kilaka У моїй діяльності 3 фрагмент у всіх трьох фрагментах я отримую дані з мережі, методу якого я повинен дотримуватися
Mansukh Ahir

0

Я використовував метод приховати / Показати у своїй діяльності з 4 фрагментами, це вирішило моє рішення, але деякий час випадково, коли я показую діалогове вікно, воно дає вікно поганого виключення токена, коли я використовував метод додавання та заміни, тоді виняток поганого маркера не виникає, тому я думаю, шоу / метод приховування не є ідеальним

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