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

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

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


person Spidy    schedule 22.06.2011    source источник
comment
Я знаю, что putFragment будет использоваться в сочетании с onSaveInstanceState для сохранения ссылки на фрагмент, если действие будет уничтожено, скажем, при изменении ориентации или если ОС необходимо восстановить память, а фрагмент будет извлечен, скажем, onCreate(...). Что было бы полезно знать, так это примеры, когда вы можете захотеть сохранить ссылку. Я только что закончил проект переноса фрагментов, где я никогда этого не делал, хотя, возможно, мне следовало бы.   -  person PJL    schedule 23.06.2011
comment
У меня есть макет с двумя панелями как для альбомной, так и для портретной ориентации, для которых действия воссоздаются при изменении ориентации. При изменении ориентации мои фрагменты воссоздаются и загружаются в свои контейнеры, поэтому, как упоминалось выше, я не нашел необходимости использовать put|getFragment, поэтому любые хорошие примеры того, когда использовать, были бы хороши.   -  person PJL    schedule 25.06.2011
comment
невероятно идиотская архитектура андроида меня убивает...   -  person syloc    schedule 26.04.2013


Ответы (3)


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

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

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

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

person hackbod    schedule 01.07.2011
comment
Это имеет массу смысла. Спасибо, хакбод. - person Spidy; 01.07.2011
comment
Еще раз спасибо. Извините, что в отпуске, поэтому не могу присудить награду самостоятельно. - person PJL; 08.07.2011
comment
Разве это не может быть реализовано с помощью getFragmentManager().findFragmentByTag() каждый раз в onCreate? - person Sudarshan Bhat; 18.11.2014

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

public void onSaveInstanceState(Bundle outState){
   getFragmentManager().putFragment(outState,"myfragment",myfragment);
}
public void onRetoreInstanceState(Bundle inState){
   myFragment = getFragmentManager().getFragment(inState,"myfragment");
}
person polen    schedule 26.09.2012
comment
не забывай эти супер звонки - person Eric Cochran; 11.08.2014
comment
Нельзя ли просто получить ссылку на этот фрагмент из FragmentManager? Если да, то зачем мне вообще помещать его в saveInstanceState? - person azizbekian; 11.07.2016

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

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

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

person Macarse    schedule 27.06.2011
comment
Спасибо за ссылку. Я все еще несколько не уверен, прочитав это, относительно того, когда мне лучше всего использовать эти методы (возможно, я просто не понимаю). Я использовал методы для извлечения фрагментов по тегам и использовал прослушиватель... Жаль, что демонстрационный образец API не включает использование этих методов. - person PJL; 27.06.2011
comment
@PJL: Вы когда-нибудь использовали onSaveInstanceState? Вот отличный ответ об этом от Рето Мейера: stackoverflow.com/questions/151777/ put|getFragment, как упомянула Дайанна, будет использоваться именно для этого, но при работе с Fragments. - person Macarse; 27.06.2011
comment
Спасибо за ссылку. Я использую onSaveInstanceState, т.е. для моего списка левых фрагментов с двойной панелью я использую его для сохранения текущей выбранной позиции (согласно FragmentLayout), однако мне не нужно связываться с правым фрагментом. - person PJL; 08.07.2011