Фрагменты - это забавные вещи, но, как я подумал, когда вы узнаете их причуды, они станут бесценным инструментом для написания хорошего кода на нескольких устройствах.
Однако, исправляя ошибку изменения ориентации, я запустилпротив стены.Чтобы мой фрагмент работал, ему нужен доступ к представлению, которое принадлежит к нему, и содержит Activity, ведущую меня в веселую погоню, пытаясь выяснить, как взаимодействуют жизненные циклы Activity & Fragment.
Я добавляю фрагмент в свое представление Activityв методе onCreate()
:
// Only add a fragment once, as after it's been added it cannot be replaced (Even though there is a .replace() method. Which is a massive gaping hole in fragments as a technology if you ask me)
if(savedInstanceState == null) {
MainMenuFragment menu= new MainMenuFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.menuFrame, menu);
transaction.commit();
}
, ведущем к этому действию-> Жизненный цикл фрагмента:
01-04 15:17:27.226: W/SinglePaneActivity 0: onCreate()
01-04 15:17:27.378: W/MainMenuFragment 0: onAttach() to SinglePaneActivity 0
01-04 15:17:27.378: W/MainMenuFragment 0: onCreate()
01-04 15:17:27.453: W/MainMenuFragment 0: onActivityCreated()
01-04 15:17:27.476: W/MainMenuFragment 0: onStart()
01-04 15:17:27.476: W/SinglePaneActivity 0: onStart()
01-04 15:17:27.476: W/SinglePaneActivity 0: onResume()
01-04 15:17:27.476: W/MainMenuFragment 0: onResume()
Изменение ориентации, однако, подчеркивает, что это обычно не так, фрагменты AonCreate()
метод не вызывается после родительской деятельности onCreate()
.На самом деле, первый вызов жизненного цикла onAttach()
фрагмента происходит еще до того, как действие было даже создано (null
передается в качестве аргумента):
01-04 15:10:49.589: W/MainMenuFragment 0: onPause()
01-04 15:10:49.589: W/SinglePaneActivity 0: onPause()
01-04 15:10:49.589: W/MainMenuFragment 0: onStop()
01-04 15:10:49.589: W/SinglePaneActivity 0: onStop()
01-04 15:10:49.589: W/MainMenuFragment 0: onDestroyView()
01-04 15:10:49.589: W/MainMenuFragment 0: onDestroy()
01-04 15:10:49.589: W/MainMenuFragment 0: onDetach()
01-04 15:10:49.609: W/SinglePaneActivity 0: onDestroy()
01-04 15:10:49.617: W/MainMenuFragment 1: onAttach() to null
01-04 15:10:49.617: W/MainMenuFragment 1: onCreate()
01-04 15:10:49.617: W/SinglePaneActivity 1: onCreate()
01-04 15:10:49.890: W/MainMenuFragment 1: onActivityCreated()
01-04 15:10:49.917: W/MainMenuFragment 1: onStart()
01-04 15:10:49.917: W/SinglePaneActivity 1: onStart()
01-04 15:10:49.921: W/SinglePaneActivity 1: onResume()
01-04 15:10:49.921: W/MainMenuFragment 1: onResume()
Я абсолютно не знаю, почему это происходит.Может ли кто-нибудь пролить свет на то, почему Fragment.onAttach()
вызывается до того, как он содержит Activity, был создан?
У меня есть фрагменты, которым не нужен доступ к их содержащей активности (до взаимодействия с пользовательским интерфейсом), как и ожидалось.