Подтвердить что ты не робот

Когда использовать FragmentManager:: putFragment и getFragment

У меня есть приложение, которое использует фрагменты, и я играл с тем, как использовать один и тот же фрагмент в Activity с двойной панелью и Activity как самостоятельный. Все еще не уверен в лучшем методе завершения этого, но я заметил, что FragmentManager имеет функцию putFragment и getFragment. Меня смущает то, что вы должны предоставить Bundle в качестве параметра как для функции get, так и для put. Как разделять действия имеют один и тот же пакет? Очевидно, вы могли бы передать Bundle в качестве параметра, но в этот момент я чувствую, что вы просто путаете вещи.

Итак, что такое хороший сценарий для использования getFragment и putFragment? Включите описание параметра Bundle.

4b9b3361

Ответ 1

Основной ответ:

Это полезно только при реализации onSaveInstanceState() и восстановления этого состояния в onCreate(). Если вы не используете onSaveInstanceState(), вы можете забыть об этих методах и притворяться, будто они не существуют.

Проблема, которую они решают: если вы хотите сохранить ссылку на фрагмент в "сохраненном состоянии экземпляра", вы не можете просто разместить ссылку на объект там. Во-первых, потому что вы не можете поместить простой объект в Bundle.:) И причина этого в том, что точка этого сохраненного состояния заключается в том, что он будет скопирован из вашего процесса, поэтому, если ваш процесс нужно убить, он может быть позже скопирован обратно в новый процесс, -инициализировать свою активность/фрагмент. Необработанный объект имеет смысл только в контексте процесса, в котором он запущен, поэтому невозможно правильно скопировать ссылку на такой объект из вашего текущего процесса и в другой.

Итак, что putFragment()/getFragment() do помещает кусок данных в данный Bundle, который может идентифицировать этот фрагмент в новом экземпляре вашей активности/фрагмента в другом процессе. Именно то, что это представление, не определено, но в текущей реализации это внутренний целочисленный идентификатор для этого фрагмента, который будет использоваться позже, когда FragmentManager должен заново создать этот фрагмент из ранее сохраненного состояния... это повторно созданный с тем же идентификатором, поэтому, когда вы вызываете getFragment(), он может извлекать целое число и использовать его для определения правильного объекта Fragment для возврата к вызывающему, который соответствует ранее сохраненному.

Ответ 2

Короче говоря, именно так вы можете восстановить ссылку фрагмента после восстановления Activity. Например, когда вы создаете фрагмент и используете его во всей своей деятельности, поэтому после изменения конфигурации ваша деятельность воссоздается, вы хотите, чтобы эта ссылка возвращалась. Итак,

public void onSaveInstanceState(Bundle outState){
   getFragmentManager().putFragment(outState,"myfragment",myfragment);
}
public void onRetoreInstanceState(Bundle inState){
   myFragment = getFragmentManager().getFragment(inState,"myfragment");
}

Ответ 3

У вас есть хорошее объяснение того, что put|getFragment может использоваться в этом андроидной группе.

Хотя вся нить интересна, реальный ответ на ваш вопрос дал Дайанн Хакборн "

Вы также можете воспользоваться преимуществами API FragmentManager для сохранения фрагмент "указатель" в связке и позже извлеките его, чтобы вы могли поддерживать прямые указатели по всему штату сохранения/восстановления.