2

Я пытаюсь лучше понять FragmentManager и FragmentTransactions, чтобы правильно разработать мое приложение. Это особенно касается их жизненного цикла и долгосрочного эффекта совершения FragmentTransaction (add). Причина, по которой у меня возникает путаница, - это когда я запускал пример Activity, указанный в конце сообщения.Понимание жизненного цикла FragmentManager и FragmentTransaction в отношении активности

Я намеренно создал статическую переменную FragmentManager, называемую fragMan, и сначала установил ее в null. Затем он проверяется в onCreate(), если он равен null, и когда отображается нулевое значение, переменная fragMan устанавливается в возвращаемое значение getFragmentManager(). Во время изменения конфигурации Log.d показал, что fragma не был нулевым, но ранее добавленный фрагмент «CameraFragment» не был найден в fragman, а fragman.isDestroyed() возвратил true. Это для меня означает, что Activity.getFragmentManager() возвращает новый экземпляр FragmentManager, и что старый экземпляр FragmentManager в fragMan стерли свои данные (?)

Вот где путаница приходит.

1) Как «CameraFragment» все еще ассоциируется в Activity при изменении конфигурации и найден в новом экземпляре FragmentManager?

2) Когда я нажал кнопку «Назад» на своем телефоне, чтобы выйти из Activity, я перезапустил образец «Активность» в меню «Службы». CameraFragment больше не был виден, и проверка onCreate()
показала, что fragMan все еще не имеет значения null. Я подумал, что нажатие на кнопку с обратной связью называется командой по умолчанию(), очистка активности из памяти и перезапуск ее приведет к такому же результату, что и начальный запуск образца Activity?

Благодарим вас за помощь и помощь!

public class MainActivity extends Activity 
{ 

static FragmentManager fragMan = null; 
FragmentTransaction fragTransaction; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if (fragMan != null) 
    { 

     Log.d("log", Boolean.toString(fragMan.isDestroyed())); 
        if(fragMan.findFragmentByTag("Camera Preview") == null) 
        { 
        Log.d("log", "Camera Preview not found."); 
        } 
    } 
    else 
    { 
     fragMan = getFragmentManager(); 
     fragTransaction = fragMan.beginTransaction(); 
     Fragment cameraFragment = new CameraFragment(); 
     ViewGroup root_view = (ViewGroup) findViewById(android.R.id.content); 
     fragTransaction.add(root_view.getId(), cameraFragment, "Camera Preview"); 
     fragTransaction.commit(); 

    } 

ответ

3

Статические переменные в Java поддерживаются через активность создания/уничтожения - они связаны с самим классом, но не конкретный экземпляр класса.

Смотрите официальную документацию здесь: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Ваше приложение не заканчивается, когда пользователь возвращается на домашний экран, он просто получает положенным в фоновом состоянии. Если вы принудительно остановили приложение и перезапустили его, то статический FragmentManager будет равен нулю.

Что касается CameraFragment, если вы не установили setRetainInstance (true), он будет уничтожен при изменении ориентации.

==== EDIT

Вот более подробный поток, что происходит ...

  1. Вы открываете приложение для впервые
  2. активность, скажем, экземпляр A1, будет создаваться и его соответствующий экземпляр FragmentManager, FM1, также создается
  3. Вы сохраняете FM1 как статическую переменную
  4. Вы возвращаетесь на главную
  5. Действия A1 и FM1 уничтожаются из-за обычного жизненного цикла активности, хотя ссылка на FM1 все еще удерживается статической переменной.На этом этапе FM1 теряет все фрагменты, которые он содержит, и isDestroyed() вернет true.
  6. Запуск приложения снова
  7. Новая активность экземпляра A2 получает созданный вместе с новым экземпляром FragmentManager FM2
+0

Эй Дон, Спасибо за ответ. Я знал, что статические переменные привязаны к существованию процесса приложения, а не к экземпляру Activity (class). Что касается главного экрана, я понимаю, что действие не уничтожается, если пользователь нажимает кнопку «домой», но я видел команду «onStop()» в журнале, когда я нажал кнопку «Назад». Основная проблема заключается в путанице в том, как статический objectManager (а не экземпляр CameraFragment) не является нулевым, но все же возвращен true для isDestroyed() и не смог найти CameraFragment из ранее. – blkhatpersian

+0

FragmentManager - статическая переменная, и, как вы указали, привязана к приложению - вот почему это не так, когда вы возвращаетесь к Activity. – don

+0

Ваш отредактированный ответ с подробным потоком помогает много! Я экспериментировал с добавлением фрагмента динамически в Activity и теперь знаю, как лучше всего это сделать. Очевидно, статический фрагментатор будет просто пустой тратой памяти. Спасибо, Дон – blkhatpersian

Смежные вопросы