Жизненные циклы фрагментов / действий и Изменение ориентации

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

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

Я добавляю фрагмент в свое представление «Действия» в его методе 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()

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

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

11
задан Graeme 4 January 2012 в 15:31
поделиться