Intereting Posts
Как открыть программу SearchView программно? Получить имя устройства Android Лучшая практика обработки исключений для Android? Отформатируйте относительную дату в формате, удобочитаемом человеком, на Android, используя Android DateUtils API Как удалить доверенный сертификат CA с установленными приложениями при удалении приложения Пользовательский глобальный класс приложения разбивается на "android.app.Application не может быть отброшен в" Как избежать нескольких экземпляров одной и той же Деятельности? Подписывает ли приложение защиту от несанкционированного доступа к файлу? Как слиться с двумя растровыми изображениями над другим Файлы обмена файлами Android, отправляя их по электронной почте или другим приложениям Использует ли «Избегайте базиса инъекций зависимостей» в Руководстве по памяти Android для кинжала? Преобразование InputStream в JSONObject Прослушиватель уровня изображения в google maps v2 в android Android – EditText предоставляет исключение IndexOutOfBounds при использовании textAllCaps Android + Pair устройства через программный интерфейс Bluetooth

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

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

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

Solutions Collecting From Web of "Когда использовать FragmentManager :: putFragment и getFragment"

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

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

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

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

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

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

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

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

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