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
а также onStart
FragmentManager завершит процесс компоновки, вызвав onCreateView()
на каждый фрагмент, который был совершен до сих пор. Потом позвонит onStart()
на каждом фрагменте, когда действие началось.
Если вы хотите зафиксировать фрагмент в более позднем обратном вызове, скажем, onResume()
, FragmentManager необходимо будет полностью настроить фрагмент до определенной точки, поэтому он будет идти вниз по жизненному циклу. onAttach()
, onCreate()
, onCreateView()
, onViewCreated()
, onStart()
, и наконец onResume()
все сразу. Теперь фрагмент будет подхвачен остальной частью деятельности.
Вообще говоря, обычно у Действия нет прямого доступа к Fragment's
внутренние элементы View. Фрагмент обрабатывает события просмотра. При необходимости передает события обратно в Activity. Это позволяет вам изменять макет фрагмента так, как вы хотите, без необходимости изменять действие. Это также позволяет вам повторно использовать фрагмент в различных видах деятельности.