Принимает ли findFragmentById FrameLayout, а не фрагмент?
Я новичок в концепции
Fragments
В видео, которое я смотрел, они использовали этот фрагмент кода:
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.my_container);
if(fragment == null){
fragment = new FragmentMain();
fragmentManager.beginTransaction()
.add(R.id.my_container, fragment)
.commit();
}
Чтобы создать через java.
В
findFragmentById
они прошли вFrameLayout
(my_container), а не файл. Я читал в документации, что вы можете передать идентификатор контейнера, но меня смущает, как он инициализирует его какFragment
. Как это работает?Должен ли я использовать
FragmentManager
? Я читал в документации, что он устарел.
Спасибо!
2 ответа
В
findFragmentById
они прошли вFrameLayout(my_container)
а не Фрагмент. Я читал в документации, что вы можете передать идентификатор контейнера, но меня смущает, как он инициализирует его как фрагмент. Как это работает?
Вы можете думать о контейнере как о заполнителе, который может содержать фрагмент за раз; изначально у него нет фрагмента, и в этом случае
if(fragment == null)
будет выполнено, поэтому вы можете выполнить транзакцию фрагмента (Итак, макет контейнера теперь заменен представлением фрагмента, который является другим макетом xml, назначенным этому конкретному фрагменту и возвращенным его обратным вызовом.
onCreateView()
- это один из обратных вызовов жизненного цикла фрагмента, который вызывается системой до тех пор, пока фрагмент не станет полностью видимым для пользователя в заполнителе.
Позже, когда вы хотите, чтобы этот заполнитель содержал другой фрагмент, вы можете выполнить транзакцию снова, где она повторяет то же самое с новым фрагментом, заполнитель отобразит макет нового фрагмента, а методы жизненного цикла этого фрагмента получат называется
Стоит ли использовать? Я читал в документации, что он устарел.
FragmentManger
(из
android.app
пакет) и его
getFragmentManager()
устарели, и вы должны использовать FragmentManager
(из
androidx.fragment.app
пакет) и
getSupportFragmentManager()
вместо этого, как вы уже сделали.
Для получения дополнительной информации вы можете посмотреть на FragmentManager документ и фрагмент жизненного цикл .
Он заглянет в контейнер с данным идентификатором и выдаст вам то, что в данный момент находится внутри. Ни в коем случае
findFragmentById
инициализироватьFragment
, он будет просматривать только существующие, как следует из названия.Не стоит использовать родной в новых версиях Android, поскольку он устарел, но
FragmentManager
из библиотеки AndroidX Fragment , предоставляя ту же функциональность. См. Также: https://developer.android.com/guide/fragments/fragmentmanager.