Я пытаюсь лучше понять 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();
}
Эй Дон, Спасибо за ответ. Я знал, что статические переменные привязаны к существованию процесса приложения, а не к экземпляру Activity (class). Что касается главного экрана, я понимаю, что действие не уничтожается, если пользователь нажимает кнопку «домой», но я видел команду «onStop()» в журнале, когда я нажал кнопку «Назад». Основная проблема заключается в путанице в том, как статический objectManager (а не экземпляр CameraFragment) не является нулевым, но все же возвращен true для isDestroyed() и не смог найти CameraFragment из ранее. – blkhatpersian
FragmentManager - статическая переменная, и, как вы указали, привязана к приложению - вот почему это не так, когда вы возвращаетесь к Activity. – don
Ваш отредактированный ответ с подробным потоком помогает много! Я экспериментировал с добавлением фрагмента динамически в Activity и теперь знаю, как лучше всего это сделать. Очевидно, статический фрагментатор будет просто пустой тратой памяти. Спасибо, Дон – blkhatpersian