Фрагмент / активность Жизненные циклы и изменение ориентации - PullRequest
11 голосов
/ 04 января 2012

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

Однако, исправляя ошибку изменения ориентации, я запустилпротив стены.Чтобы мой фрагмент работал, ему нужен доступ к представлению, которое принадлежит к нему, и содержит 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, был создан?

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

1 Ответ

10 голосов
/ 04 января 2012

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() Я понятия не имею.Тем более, что «присоединение» происходит до того, как появится действие.

Конечно, мне нужен был метод onActivityCreated(), который происходит как последний вызов в наборе «Создание» События жизненного цикла фрагмента .

...