среда, 26 сентября 2012 г.

Готовим фрагменты с картами


Если вы когда-нибудь использовали карты в приложении, то наверно знаете, что виджет MapView может быть использован только в activity унаследованной от MapActivity. Я никогда не понимал почему так сделано, и посмотрев реализацию MapActivity так и не понял, ну зачем было нужно это странное правило, ведь все что было в MapActivity очень просто реализовывалось в обычной Activity. 


С появлением Android 3.0 и ее классной фичи Fragments все усложнилось в разы, для использования Fragment'ов (поверьте мне, узнав что это такое вы точно захотите их использовать, если конечно вы уже не использользуете их) нужно наследоваться от класса FragmentActivity,  а в Java как вы знаете нет множественного наследования, и как теперь быть, если нужно использовать фрагменты с картами?

Первое решение было создано Jake Wharton, он предложил пересобрать библиотеку android-support с условием что унаследовать FragmentActivity от MapActivity. Это был просто огромный костыль, который не понравился никому, но вариантов не было. С выходом каждой новой версии android-support пришлось пересобирать ее по новой, что не очень удобно.

Со временем придумали второе решение, которое заключалось в том, чтобы с помощью класса LocalActivityManager, заключить содержимое activity c картами в любой фрагмент в качестве его содержимого. Вот ссылка на решение, которое я немного переделал взяв тут.

Все что вам нужно сделать это наследовать от ActivityHostFragment и реализовать метод getActivityClass, в котором нужно вернуть ваш активити с картами и все, можете использовать этот фрагмент там, где вам нужен был фрагмент с картами.

Но и это не самое лучшее решение, потому что LocalActivityManager объявлен Google'ом deprecated. Поэтому пока остается только ждать, хотя сами гугловцы продвигают именно это решение. Вот Issue на гуглкод. Надеюсь в новой версии android-support, эту проблему исправят.

Комментариев нет:

Отправить комментарий