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í:
- Cree una clase SherlockMapFragment en su proyecto de biblioteca actiobarsherlock. Simplemente hice una copia de SherlockFragment porque también necesitaba soporte para
setHasOptionsMenu(true)
- La actividad extiende SherlockFragmentActivity (como de costumbre)
- El fragmento amplía el nuevo SherlockMapFragment creado
- ActionBarSherlock requiere la nueva biblioteca
google-play-services_lib
- Su proyecto requiere la biblioteca ActionBarSherlock. No es necesario volver a incluir Google-play-services o compilar contra Google API.
- 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);
}
}