Intereting Posts
Android: приложение: transformClassesWithJarMergingForDebug FAILED – ZipException: дублировать запись Активность с фрагментами не изменяется при открытии клавиатуры Необходимо ли закрыть базу данных? Карты Android V2 MapView внутри пользовательского фрагмента (NPE) Android: одновременный доступ к микрофону (RecognizerIntent + собственное приложение) Изображение камеры на держателе поверхности, рисунок: Исключение из-за типа поверхности Не удалось найти текущее местоположение внутри фрагмента Может ли веб-сайт (HTML5, JavaScript) обращаться к списку контактов мобильного устройства (андроид / iPhone), файлам SDCard AudioRecord: start () status -38 RecyclerView и SwipeRefreshLayout Управление частотой обновления дисплея на устройстве Android Является ли метод onUpgrade когда-либо называемым? Как сделать EditText не сфокусированным при создании Activity Сбой карты Google с помощью ресурсов $ NotFoundException при замене в FrameLayout Как обнаружить ландшафт влево (нормальный) и правый пейзаж (обратный) с поддержкой естественных ландшафтных устройств?

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

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

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

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

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

Можно ли использовать класс 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; } 

}

Solutions Collecting From Web of "Использование ActionBarSherlock с новой поддержкой SupportMapFragment"

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

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

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

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

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); } } 

XML-макет действия:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <fragment android:id="@+id/fragment_map" android:name=".ui.fragments.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:tag="tag_fragment_map" /> <fragment android:id="@+id/fragment_help" android:name=".ui.fragments.HelpFragment" android:layout_width="0dp" android:layout_height="match_parent" android:tag="tag_fragment_help" /> </FrameLayout> 

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

 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; } } 

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

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

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

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

У нас также не было проблем с использованием новой системы карт, как описано в демоверсии Google с ABS. Мы объявили фрагмент в 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.

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

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

Ниже приведен фрагмент кода.

 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. Если вы пытаетесь реализовать его на фрагменте или в 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); } }