Принимает ли 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.

  1. В findFragmentById они прошли в FrameLayout(my_container), а не файл. Я читал в документации, что вы можете передать идентификатор контейнера, но меня смущает, как он инициализирует его как Fragment. Как это работает?

  2. Должен ли я использовать FragmentManager? Я читал в документации, что он устарел.

Спасибо!

2 ответа

Решение

В findFragmentById они прошли в FrameLayout(my_container)а не Фрагмент. Я читал в документации, что вы можете передать идентификатор контейнера, но меня смущает, как он инициализирует его как фрагмент. Как это работает?

Вы можете думать о контейнере как о заполнителе, который может содержать фрагмент за раз; изначально у него нет фрагмента, и в этом случае if(fragment == null) будет выполнено, поэтому вы можете выполнить транзакцию фрагмента (Итак, макет контейнера теперь заменен представлением фрагмента, который является другим макетом xml, назначенным этому конкретному фрагменту и возвращенным его обратным вызовом. onCreateView() - это один из обратных вызовов жизненного цикла фрагмента, который вызывается системой до тех пор, пока фрагмент не станет полностью видимым для пользователя в заполнителе.

Позже, когда вы хотите, чтобы этот заполнитель содержал другой фрагмент, вы можете выполнить транзакцию снова, где она повторяет то же самое с новым фрагментом, заполнитель отобразит макет нового фрагмента, а методы жизненного цикла этого фрагмента получат называется

Стоит ли использовать? Я читал в документации, что он устарел.

FragmentManger (из android.app пакет) и его getFragmentManager() устарели, и вы должны использовать FragmentManager (из androidx.fragment.app пакет) и getSupportFragmentManager() вместо этого, как вы уже сделали.

Для получения дополнительной информации вы можете посмотреть на FragmentManager документ и фрагмент жизненного цикл .

  1. Он заглянет в контейнер с данным идентификатором и выдаст вам то, что в данный момент находится внутри. Ни в коем случае findFragmentById инициализироватьFragment, он будет просматривать только существующие, как следует из названия.

  2. Не стоит использовать родной в новых версиях Android, поскольку он устарел, но FragmentManagerиз библиотеки AndroidX Fragment , предоставляя ту же функциональность. См. Также: https://developer.android.com/guide/fragments/fragmentmanager.

Другие вопросы по тегам