Когда использовать FragmentManager :: putFragment и getFragment - PullRequest
40 голосов
/ 23 июня 2011

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

Так, каков хороший сценарий для использования getFragment и putFragment?Пожалуйста, включите объяснение параметра Bundle.

Ответы [ 3 ]

60 голосов
/ 01 июля 2011

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

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

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

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

19 голосов
/ 26 сентября 2012

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

public void onSaveInstanceState(Bundle outState){
   getFragmentManager().putFragment(outState,"myfragment",myfragment);
}
public void onRetoreInstanceState(Bundle inState){
   myFragment = getFragmentManager().getFragment(inState,"myfragment");
}
2 голосов
/ 27 июня 2011

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

Хотя вся цепочка интересна, реальный ответ на ваш вопрос был данby Dianne Hackborn "

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...