2012-01-04 5 views
12

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

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

Я добавляю фрагмент к моей деятельности просмотра в это 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(); 
} 

ведущий к этому деятельность-> Фрагмент Lifecycle:

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() 

изменение ориентации, однако подчеркивает, что это ISN Обычно это так, A-фрагменты onCreate() метод не вызывается после его родительской активности. 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() вызывается до того, как он будет создан. Активность была создана?

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

ответ

11

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(), который происходит в качестве окончательного вызова в наборе «Создание» Fragment lifecycle events.

+0

, пожалуйста, помогите мне http://stackoverflow.com/questions/12331787/save-fragment-objects – user4o01