Usando ActionBarSherlock Con el Nuevo SupportMapFragment


Estoy viendo el uso de ActionBarSherlock, pero tengo una consulta que me está reteniendo.

Por lo tanto, mi aplicación debe ser totalmente compatible con el nivel de API 7.

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

** Mi Pregunta **

¿Es posible usar la clase SupportMapFragment junto con ActionBarSherlock?

Gracias de antemano

EDITAR

He descargado y eché un vistazo a la biblioteca. Los únicos cambios en el Fragments extendido que puedo ver son muy simples y los mismos para todos ellos.

¿Crees que podría agregar apoyo yo mismo?

Así es como son soportados.

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

}

Author: StuStirling, 2012-12-05

6 answers

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 extiende el SherlockMapFragment recién creado
  4. ActionBarSherlock requiere el nuevo google-play-services_lib biblioteca
  5. Su proyecto requiere la biblioteca ActionBarSherlock. No es necesario incluir los servicios de Google-play de nuevo, o para construir contra la API de Google.
  6. Como mencionó Graham, debe eliminar el soporte para 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 mapa fragmento:

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;
    }
}
 61
Author: Mudar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-06 15:26:13

Yo he oído que Jake no va a hacer mucho más a ABS ya que Google puede estar sacando su propia barra de acción compatible con versiones anteriores. Creo que si no recuerdo mal que se discutió en uno de los relacionados con Android Google+ hangouts.

Los nuevos mapas requieren el nivel de API 8 en adelante, por lo que incluso antes de preocuparse por la barra de acción, se encontrará con problemas si debe admitir el nivel de API 7.

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

En cuanto a la barra de acción, estamos portando una aplicación en este momento y hemos agregado fácil y exitosamente un mapa a un ViewPager, creando el Fragmento programáticamente (en lugar de en XML). Lo hemos probado en múltiples dispositivos.

Tampoco hemos tenido problemas con el nuevo mapa sistema como se describe en Google demos con ABS. Declaramos el fragmento en un diseño XML y lo establecemos como el contenido de la actividad. La barra de acción se muestra como normal. La actividad es una SherlockFragmentActivity.

 4
Author: Graham Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-05 12:15:43

Básicamente de lo que estoy seguro es que este SupportMapFragment es totalmente nuevo y tal vez el mantenedor de ActionBarSherlock aún no tuvo tiempo de agregarlo al proyecto ABS.

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

Para otras API lvls puede encontrar una solución here:http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/

 3
Author: Pavlos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-05 11:19:44

Intenté implementar SupportMapFragment con ActionBarSherlock.

Está funcionando muy bien.

introduzca la descripción de la imagen aquí

A continuación se muestra el 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.

 3
Author: Vipul Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-05 12:09:49

Todavía no puedo comentar en todas partes, por eso respondo a @sureshcheemalamudi Si está tratando de implementarlo en un Fragmento, o SherlockFragment, eche un vistazo a esto: https://stackoverflow.com/a/17803561/1755300

 0
Author: unmultimedio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:32:11
@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);
    }
}
 0
Author: Rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-12 12:59:32