Android Fragments API появились в версии Android 3.0 Honeycomb и предоставляет неплохую альтернативу масштабирования и отображения частей вашего приложения на устройствах с различными разрешениями экрана. Как писалось ранее, фрагмент в андроид представляет из себя независимую частичку, или если хотите, элемент Activity, со своим жизненным циклом. Про фрагменты можно почитать в оф. документации.
Сейчас бы хотелось рассмотреть следующий пример (думаю, довольно актуальный для приложений, написанных под планшетник и использующий Google Maps). Допустим, перед нами стоит задача – отобразить карту (MapView) внутри фрагмента (Fragment). Всё бы хорошо, только только есть одно но. А точнее два. Во-первых, каждый фрагмент приложения – это не отдельная Activity, а каждый отображаемый фрагмент является частью Activity и какбы живет своей жизнью внутри неё. Во-вторых существует ограничение, по которому создавать экземпляр MapView можно только внутри MapActivity. (MapViews can only be created inside instances of MapActivity). А вот отдельного компонента, такого как MapFragment к примеру, API не предоставляет (по крайней мере пока). Так что же делать? Как отобразить карту внутри фрагмента в андроид?. Немного погуглив можно найти пару решений.
Первое – предложенное неким пользователем inazaruk. Заключается оно в следующем:
1. MainFragmentActivity extends FragmentActivity (from support library) and has MapFragment;
2. MyMapActivity extends MapActivity and contain MapView;
3. LocalActivityManagerFragment hosts LocalActivityManager;
4. MapFragment extends LocalActivityManagerFragment and contains TabHost;
5. And this TabHost contains the only tab with MyMapActivity in it;
Если в двух словах, то он предлагает в корневой фрагмент положить табхост (наверное единственный компонент, который может хостить внутри себя другую активити). Также для него необходимо будет сделать setup() и назначить LocalActivityManager. Код примера находится на github. Пример вполне работоспособный, только вот LocalActivityManager помечен как deprecated.
Второй способ рассматривается вот в этой ветке в google groups. Заключается от в использовании (а точнее модицикации) FragmentActivity из библиотеки совместимости (compatibility library). Если коротко – то выкачивание и присоединение исходников этой библиотеки к проекту, а также модификация её при помощи нехитрого «финта ушами». Не знаю, насколько данный способ эффективен, так как там после модификаций необходимо будет фиксить compilation errors (восновном ошибки приведения типов), и во что это всё может вылиться – сложно предугадать.
Данное Issue 15347: Add support for MapFragment добавлено на google code.