Подтвердить что ты не робот

Фрагмент/активность Lifecycles и изменение ориентации

Фрагменты - забавные вещи, но, как я думал, как только вы знаете их причуды, они являются неоценимым инструментом для написания хорошего кода на нескольких устройствах.

Однако, исправляя ошибку изменения ориентации, я подбежал к стене. Для того чтобы мой фрагмент работал, ему нужен доступ к представлению, который принадлежит ему, содержащему Activity, ведущий меня на веселой погоне, пытаясь найти, как взаимодействуют жизненные циклы Activity и Fragment.

Я добавляю фрагмент в свой вид деятельности в нем onCreate() метод:

// Only add a fragment once, as after it 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()

Изменение ориентации, однако, подчеркивает, что это обычно не так, метод фрагментов onCreate() не вызывается после него parent Activities onCreate(). Infact, первый вызов жизненного цикла фрагмента 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?

У меня есть фрагменты, которым не нужен доступ к их содержательной активности (пока взаимодействие с пользовательским интерфейсом) не будет работать.

4b9b3361

Ответ 1

Argh,

01-04 15:46:23.175: W/MainMenuFragment   0: onAttach() to SinglePaneActivity 0
01-04 15:46:23.179: W/MainMenuFragment   0: onCreate()
01-04 15:46:23.246: W/MainMenuFragment   0: onActivityCreated() with Activity SinglePaneActivity 0
01-04 15:46:23.269: W/MainMenuFragment   0: onStart()
01-04 15:46:23.269: W/SinglePaneActivity 0: onStart()

Почему, черт возьми, есть метод onAttach(), о котором я понятия не имею. Тем более, что "attach" происходит до того, как появится Activity.

Мне нужен был, конечно, onActivityCreated(), который происходит как окончательный вызов в наборе "Creation" событий жизненного цикла фрагмента.