Использование ActionBarSherlock с новой поддержкой SupportMapFragment

Я смотрю на использование ActionbarSherlock, но у меня есть один запрос, который удерживает меня.

Поэтому мое приложение должно быть полностью обратно совместимо с уровнем API 7.

Мне нужно внедрить новые Карты Google в моем приложении и сделать это, я должен использовать class SupportMapFragment.

** Мой вопрос **

Можно ли использовать class SupportMapFragment вместе с ActionBarSherlock ?

заранее спасибо

РЕДАКТИРОВАТЬ

Я скачал и посмотрел на библиотеку. Единственные изменения в расширенных Fragments я вижу, очень просты и одинаковы для всех.

Как вы думаете, я могу добавить поддержку?

вот как они поддерживаются.

 package com.actionbarsherlock.app; import android.app.Activity; import android.support.v4.app.DialogFragment; import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; import com.actionbarsherlock.internal.view.menu.MenuWrapper; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener; import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener; import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener; public class SherlockDialogFragment extends DialogFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { private SherlockFragmentActivity mActivity; public SherlockFragmentActivity getSherlockActivity() { return mActivity; } @Override public void onAttach(Activity activity) { if (!(activity instanceof SherlockFragmentActivity)) { throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); } mActivity = (SherlockFragmentActivity)activity; super.onAttach(activity); } @Override public void onDetach() { mActivity = null; super.onDetach(); } @Override public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { //Nothing to see here. } @Override public final void onPrepareOptionsMenu(android.view.Menu menu) { onPrepareOptionsMenu(new MenuWrapper(menu)); } @Override public void onPrepareOptionsMenu(Menu menu) { //Nothing to see here. } @Override public final boolean onOptionsItemSelected(android.view.MenuItem item) { return onOptionsItemSelected(new MenuItemWrapper(item)); } @Override public boolean onOptionsItemSelected(MenuItem item) { //Nothing to see here. return false; } 

}

Все это работает как шарм, в основном благодаря большой работе Джейка по ActionBarSherlock

Вот шаги, которые я выполнил:

  1. Создайте class SherlockMapFragment в вашем проекте библиотеки actiobarsherlock. Я просто сделал копию SherlockFragment, потому что мне также нужна поддержка setHasOptionsMenu(true)
  2. Активность распространяется на SherlockFragmentActivity (как обычно)
  3. Этот fragment расширяет недавно созданный файл SherlockMapFragment
  4. ActionBarSherlock требует новую библиотеку google-play-services_lib
  5. Для вашего проекта требуется библиотека ActionBarSherlock. Не нужно снова включать сервисы google-play или создавать против Google API.
  6. Как упоминалось в Graham, вам нужно отказаться от поддержки устройств API 7:

И вот какой код для более подробного объяснения:

SherlockMapFragment

 package com.actionbarsherlock.app; import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; import com.actionbarsherlock.internal.view.menu.MenuWrapper; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.google.android.gms.maps.SupportMapFragment; import android.app.Activity; import android.support.v4.app.Watson.OnCreateOptionsMenuListener; import android.support.v4.app.Watson.OnOptionsItemSelectedListener; import android.support.v4.app.Watson.OnPrepareOptionsMenuListener; public class SherlockMapFragment extends SupportMapFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { private SherlockFragmentActivity mActivity; public SherlockFragmentActivity getSherlockActivity() { return mActivity; } @Override public void onAttach(Activity activity) { if (!(activity instanceof SherlockFragmentActivity)) { throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); } mActivity = (SherlockFragmentActivity) activity; super.onAttach(activity); } @Override public void onDetach() { mActivity = null; super.onDetach(); } @Override public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Nothing to see here. } @Override public final void onPrepareOptionsMenu(android.view.Menu menu) { onPrepareOptionsMenu(new MenuWrapper(menu)); } @Override public void onPrepareOptionsMenu(Menu menu) { // Nothing to see here. } @Override public final boolean onOptionsItemSelected(android.view.MenuItem item) { return onOptionsItemSelected(new MenuItemWrapper(item)); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Nothing to see here. return false; } } 

Активность:

 public class MainActivity extends SherlockFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 

Макет действия:

     

Фрагмент карты:

 public class MapFragment extends SherlockMapFragment { private GoogleMap mMap; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = super.onCreateView(inflater, container, savedInstanceState); mMap = getMap(); return root; } } 

Я слышал, что Джейк не собирается делать слишком много для ABS, поскольку Google может вывести свой собственный обратно совместимый ActionBar. Я думаю, если я правильно помню, это обсуждалось в одной из Android-сообществ Google+.

Для новых карт требуется уровень API 8, поэтому, прежде чем беспокоиться о панели действий, вы столкнетесь с проблемами, если вы должны поддерживать API-уровень 7.

Мой совет будет производить 2 файла макета для уровня 7 и один для 8+. На уровне 7 используйте теперь старый MapView, хотя они обесценивают его, что для меня показывает, как API-уровень 7 не обязательно стоит рассматривать как цель. В макете 8+ используйте новую систему карт.

Что касается панели действий, мы переносим приложение прямо сейчас и легко и успешно добавили карту в ViewPager , создав fragment программно (а не в XML). Мы протестировали его на нескольких устройствах.

У нас также не было проблем с использованием новой системы карт, как описано в демоверсии Google с ABS. Мы объявили fragment в XML-макете и установили это как содержимое активности. ActionBar отображается как обычно. Действие – это функция Шерлок-Фрагмент.

В основном, я уверен, что этот SupportMapFragment полностью свежий, и, возможно, у поддерживающего ActionBarSherlock еще нет времени добавить его в проект ABS.

Также он требует API Lvl 8+, поэтому вы можете просто удалить свою поддержку на устройствах API lvl 7 или вам придется ждать, пока Джейк добавит поддержку для нового SupportMapFragment.

Для других API lvls вы можете найти работу здесь: http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/

Я попробовал реализовать SupportMapFragment с помощью ActionBarSherlock.

Он работает очень хорошо.

введите описание изображения здесь

Ниже приведен fragment кода.

 package com.example.newmapview; import android.os.Bundle; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.SubMenu; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; public class MainActivity extends SherlockFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SupportMapFragment fragment = SupportMapFragment.newInstance(); getSupportFragmentManager().beginTransaction() .add(R.id.mapLayout, fragment).commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { SubMenu subMenu = menu.addSubMenu("Type"); subMenu.add("Normal"); subMenu.add("SATELLITE"); subMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getTitle().toString().equalsIgnoreCase("Normal")) { Toast.makeText(this, "Clicked Normal", Toast.LENGTH_LONG).show(); GoogleMap googleMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.mapLayout)).getMap(); if (googleMap != null) googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); else Toast.makeText(this, "GoogleMap is null", Toast.LENGTH_LONG) .show(); } else if (item.getTitle().toString().equalsIgnoreCase("SATELLITE")) { Toast.makeText(this, "Clicked SATELLITE", Toast.LENGTH_LONG).show(); GoogleMap googleMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.mapLayout)).getMap(); if (googleMap != null) googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); else Toast.makeText(this, "GoogleMap is null", Toast.LENGTH_LONG) .show(); } return true; } } 

Надеюсь, это поможет.

Я не могу комментировать всюду, поэтому я отвечаю @sureshcheemalamudi. Если вы пытаетесь реализовать его на fragmentе или в файле SherlockFragment, взгляните на это: https://stackoverflow.com/a/17803561/1755300

 @Override public boolean onOptionsItemSelected(MenuItem item) { // toggle mapType if (mapFragment != null) { googleMap = mapFragment.getMap(); } switch (item.getItemId()) { case R.id.action_normal: googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); Toast.makeText(getActivity(), "normal", Toast.LENGTH_LONG).show(); return true; case R.id.action_satellite: googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); Toast.makeText(getActivity(), "satellite", Toast.LENGTH_LONG) .show(); return true; case R.id.action_terrian: googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); Toast.makeText(getActivity(), "terian", Toast.LENGTH_LONG).show(); return true; case R.id.action_hybrid: googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); Toast.makeText(getActivity(), "hybrid", Toast.LENGTH_LONG).show(); return true; default: return super.onOptionsItemSelected(item); } } 
  • Как определить использование размера кучи приложения для Android
  • Как написать выходы в Log in Android?
  • Ошибка импорта HoloEverywhere
  • Как использовать интернет-соединение для ПК на телефоне Android?
  • Как создать пользовательскую функцию в SQLite?
  • Как использовать и стилить новый AlertDialog из appCompat 22.1 и выше
  • Написание XML на Android
  • Android Studio: Gradle: ошибка: не удается найти символьную переменную
  • ActivityNotFoundException?
  • Вертикальная линия с использованием XML-drawable
  • Что такое пространство приложений Android для Android?
  • Interesting Posts

    Является ли язык встроенной сборки медленнее, чем собственный код на C ++?

    Как проверить одно поле, связанное с чужим значением в ASP.NET MVC 3

    Как я могу перебирать все флажки в форме?

    Два внешних дисплея с одного ноутбука с VGA и HDMI?

    Linux: сравнение структуры каталогов без сравнения файлов

    Каково обоснование наличия сопутствующих объектов в Scala?

    Группировать список объектов по атрибуту: Java

    Отладка Android с помощью Logcat и эмулятора. Является ли это возможным?

    Как определить регистрацию пользователя в Windows XP?

    Доступ к внешнему компьютеру без переадресации портов

    R-Project не применимый метод для «мета», применяемый к объекту classа «характер»,

    Получить список активных PendingIntents в AlarmManager

    Как запретить Android делать снимок экрана, когда мое приложение переходит на задний план?

    Заполнение пружины @ Value во время модульного теста

    Core Data и SQLite для опытных разработчиков SQL

    Давайте будем гением компьютера.