Android CommitNow не вызывает onCreateView из onCreate

Создать приложение с фрагментом, содержащим Button id=button In

  @Override
    protected void onStart() {
        super.onStart();
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.activity_main, new Testfrag())
                .commitNow();
        View b = findViewById(R.id.button);

    }

б возвращается как кнопка и фрагменты onCreateView вызывается до конца метода. Но в

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 FragmentManager fm=  getSupportFragmentManager();
       fm.beginTransaction()
          .add(R.id.activity_main, new Testfrag())
        .commitNow();
   View b = findViewById(R.id.button);
}

б ноль и фрагменты onCreateView не вызывается, пока метод не завершится. Это может быть "особенность", но в документации ничего нет об этом.

Почему commit Now ведет себя по-другому в onCreate - не звонит onCreateView до тех пор, пока и OnStart (или любой другой обработчик событий), где onCreateView называется синхронно?

1 ответ

Я честно удивлен, первая работает.

Если бы мне пришлось делать ставки, это FragmentManager не вызывает обратные вызовы жизненного цикла фрагмента за пределами текущего жизненного цикла действия. От onCreate() это позвонит onAttach() затем onCreate() на фрагменте. В какой-то момент между onCreate а также onStartFragmentManager завершит процесс компоновки, вызвав onCreateView() на каждый фрагмент, который был совершен до сих пор. Потом позвонит onStart() на каждом фрагменте, когда действие началось.

Если вы хотите зафиксировать фрагмент в более позднем обратном вызове, скажем, onResume(), FragmentManager необходимо будет полностью настроить фрагмент до определенной точки, поэтому он будет идти вниз по жизненному циклу. onAttach(), onCreate(), onCreateView(), onViewCreated(), onStart(), и наконец onResume() все сразу. Теперь фрагмент будет подхвачен остальной частью деятельности.

Вообще говоря, обычно у Действия нет прямого доступа к Fragment's внутренние элементы View. Фрагмент обрабатывает события просмотра. При необходимости передает события обратно в Activity. Это позволяет вам изменять макет фрагмента так, как вы хотите, без необходимости изменять действие. Это также позволяет вам повторно использовать фрагмент в различных видах деятельности.

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