android android-actionbar actionbarsherlock actionbarsherlock-map

android - Utilizar ActionBarSherlock con el nuevo SupportMapFragment



android-actionbar actionbarsherlock-map (6)

Básicamente, de lo que estoy seguro es de que este SupportMapFragment es totalmente nuevo y tal vez el responsable de ActionBarSherlock aún no haya tenido tiempo de agregarlo al Proyecto ABS.

También requiere API Lvl 8+ para que pueda eliminar su compatibilidad con los dispositivos API lvl 7 o tendrá que esperar a que Jake agregue soporte para el nuevo SupportMapFragment.

Para otras lvls de API, puede encontrar un trabajo aquí: http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/

Estoy buscando usar ActionbarSherlock pero tengo una consulta que me está frenando.

Por lo tanto, mi aplicación debe ser completamente compatible con API 7.

Necesito implementar el nuevo Google Maps en mi aplicación y para hacerlo necesito usar la clase SupportMapFragment.

** Mi pregunta **

¿Es posible usar la clase ActionBarSherlock junto con ActionBarSherlock ?

Gracias por adelantado

EDITAR

He descargado y he echado un vistazo a la biblioteca. Los únicos cambios a los Fragments extendidos que puedo ver son muy simples y los mismos para todos ellos.

¿Crees que podría agregar apoyo a mí mismo?

aquí es cómo son compatibles.

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

}


Intenté implementar SupportMapFragment con ActionBarSherlock.

Está funcionando muy bien.

A continuación se muestra un fragmento de código.

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

Espero que esto ayude


Todavía no puedo comentar en todas partes, por eso respondo @sureshcheemalamudi. Si intentas implementarlo en un Fragmento o en un Fragmento de Sherlock, échale un vistazo a esto: https://.com/a/17803561/1755300


Todo funciona como un encanto, principalmente gracias al gran trabajo de Jake en ActionBarSherlock

Estos son los pasos que seguí:

  1. Cree una clase SherlockMapFragment en su proyecto de biblioteca actiobarsherlock. Simplemente hice una copia de SherlockFragment porque también necesitaba soporte para setHasOptionsMenu(true)
  2. La actividad extiende SherlockFragmentActivity (como de costumbre)
  3. El fragmento amplía el nuevo SherlockMapFragment creado
  4. ActionBarSherlock requiere la nueva biblioteca google-play-services_lib
  5. Su proyecto requiere la biblioteca ActionBarSherlock. No es necesario volver a incluir Google-play-services o compilar contra Google API.
  6. Como mencionó Graham, debe dejar de admitir dispositivos API 7: <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />

Y aquí hay un código para una explicación más detallada:

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

La actividad:

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

El diseño XML de la actividad:

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

El fragmento del mapa:

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


Escuché que Jake no hará mucho más con ABS, ya que Google puede sacar su propia barra de acción compatible con versiones anteriores. Creo que si recuerdo correctamente fue discutido en uno de los hangouts de Android relacionados con Android.

Los nuevos mapas requieren API nivel 8 en adelante, así que antes de preocuparse por la barra de acciones, se encontrará con problemas si debe soportar el nivel 7 de la API.

Mi consejo sería producir 2 archivos de diseño uno para el nivel 7 y uno para 8+. En el nivel 7, use el MapView ahora viejo, aunque lo estén desaprobando, lo que para mí muestra cómo el nivel 7 de API no necesariamente vale la pena considerarlo como un objetivo. En el diseño 8+ use el nuevo sistema de mapas.

En cuanto a la barra de acciones, estamos migrando una aplicación en este momento y hemos agregado un mapa a ViewPager fácil y exitosa al crear el Fragment programáticamente (en lugar de hacerlo en XML). Lo hemos probado en múltiples dispositivos.

Tampoco tuvimos problemas al usar el nuevo sistema de mapas como se describe en las demostraciones de Google con ABS. Declaramos el fragmento en un diseño XML y lo configuramos como el contenido de la actividad. ActionBar se muestra de forma normal. La actividad es una actividad de SherlockFragment.


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