Estoy tratando de explorar el uso de la clase MapView para GoogleMap de la pantalla, sin suerte, como la mayoría de los códigos de ejemplos son el uso de MapFragment que yo no quiero.

Estoy usando Google Maps Android API v2.

Al principio, sólo para pruebas con aquí desde Google por ejemplo, me las arreglé para conseguir el típico mapa normal a la pantalla.

public class POnlineMapView extends Activity {

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.online_map_activity);
    }
}

El código anterior funciona a la perfección que muestran que todo ha sido configurado correctamente.

Ahora estoy tratando de usar la clase MapView para manipular la configuración de la pantalla, tales como el punto central, pero parece que yo soy la obtención de un objeto null cada vez que trato de obtener el objeto GoogleMap. ¿Por qué es esto así?

public class POnlineMapView extends Activity {

    private MapView myMapView;
    private GoogleMap map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        myMapView = new MapView(getApplicationContext());
        Bundle b = getIntent().getExtras();
        double longitude = b.getDouble("longitude");
        double latitude = b.getDouble("latitude");

        setContentView(R.layout.online_map_activity);
        map = myMapView.getMap();

        CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng(latitude,longitude));
        CameraUpdate zoom=CameraUpdateFactory.zoomTo(17);

        map.moveCamera(center); //this gives a NullPointerException, probably due to the myMapView.getMap() method?
        map.animateCamera(zoom);    
    }
}
  • incluso si usted no desea un mapfragment, usted todavía necesita un mapactivity…
  • ¿Qué quieres decir con eso? Quiere decir que la clase no debe ser la ampliación de la Actividad?
InformationsquelleAutor lyk | 2013-01-25

6 Comentarios

  1. 3

    Esto parece ser una vieja pregunta, pero yo estaba teniendo el mismo problema tratando de usar MapView.

    Suponiendo que se han importado correctamente el Google Play Services lib, usted tiene que comprobar si tiene acceso a los Servicios de Google, usted puede hacer esto en el método onCreate, y tiene que inicializar el Google Maps Android AP. usted puede hacer esto mediante la adición de código siguiente al método onCreate

    try {
            MapsInitializer.initialize(this);
        } catch (GooglePlayServicesNotAvailableException e) {
            Log.e("Address Map", "Could not initialize google play", e);
        }
    
    switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) )
    {
      case ConnectionResult.SUCCESS:
          Toast.makeText(getApplicationContext(), "SUCCESS", Toast.LENGTH_SHORT).show();
          break;
      case ConnectionResult.SERVICE_MISSING: 
          Toast.makeText(getApplicationContext(), "SERVICE MISSING", Toast.LENGTH_SHORT).show();
          break;
      case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: 
          Toast.makeText(getApplicationContext(), "UPDATE REQUIRED", Toast.LENGTH_SHORT).show();
          break;
      default: Toast.makeText(getApplicationContext(), GooglePlayServicesUtil.isGooglePlayServicesAvailable(this), Toast.LENGTH_SHORT).show();
    }

    Si usted consigue el ÉXITO, entonces todo está funcionando hasta ahora.
    Usted también tiene que implementar la mothods de la Actividad lyfecycle y llamar a la correspondiente methond de la vista de mapa dentro de cada uno de estos métodos:

    @Override
    protected void onResume() {
        myMapView.onResume();
        super.onResume();
    
    }
    
    @Override
    protected void onPause() {
        myMapView.onResume();
        super.onPause();
    
    }
    
    @Override
    protected void onDestroy() {
        myMapView.onDestroy();
        super.onDestroy();
       //((MapView)findViewById(R.id.mapView)).onDestroy();
    }
    
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        myMapView.onLowMemory();
    }

    Por último, usted tiene que comprobar que se ha añadido Google Maps API key para el archivo de Manifiesto:

    <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="YOUR KEY"/>

    usted puede encontrar las instrucciones para obtener su clave aquí: https://developers.google.com/maps/documentation/android/start#installing_the_google_maps_android_v2_api

    Editar:
    Se olvidó de mencionar, usted también tendrá que configurar sus aplicaciones de permisos en el archivo de manifiesto

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    Esto tiene que ser dentro del bloque de aplicación …

  2. 3

    Gracias, por fin me dio una pista para inicializar el Mapa a través de programación, lo estúpido que supervisaban 🙂

    Bueno, a veces hay ninguna opción para utilizar MapFragment (o SupportMapFragment por igual), es decir, cuando se desea utilizar el mapa de un fragmento! Esto es realmente un caso muy común cuando se trabaja con fichas (ActionBar), donde el patrón es el uso de fragmentos. Así que usted tiene su propio fragmento por ficha y en ese fragmento de un mapa en el que quieres inflar el layout que contiene un fragmento de la MapFragment, et voila – ¡buena suerte!

    Ahora, de acuerdo a la MapView especificaciones es de ninguna manera dijo que el uso de la MapView es desanimado o en desuso, así que ¿por qué no debo usar? Yo no quería hacks en el mantenimiento de la anidados fragmentos sin tener el apoyo de los SDK ( incluso el reciente apoyo lib v13 parece tener errores anidadas y fragmentos de diseño no son compatibles ), por lo que el uso de MapView convertido para mí en un BESO.

    A continuación es mi CustomMapFragment puedo usar con el diseño de la inflación (lo que permite complejo de diseño) y mapa incrustado, eres bienvenido a utilizar. Usted también puede querer extender el Fragmento de apoyo-lib en lugar de SDK.

    La onCreateView() método infla el diseño (sólo proporcionan propio) y espera que el diseño para obtener viewgroup (relativelayout,linearlayout,etc) con id «mapViewHolder» donde el mapView se adjunta al diseño de la creación. La actividad ha de implementar CustomMapFragment.Controlador de interfaz, de lo contrario ClassCastException será lanzado.

    import android.app.Activity;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Toast;
    import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.MapView;
    import com.google.android.gms.maps.MapsInitializer;
    import R;
    public class AppMapFragment extends Fragment {
    /*
    * to interact with activity
    */
    public static interface Handler {
    void onMapResume(GoogleMap map);
    }
    private Handler handler;
    private MapView mapView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
    //initialize explicitely, since we're working with MapView (not MapFragment)
    MapsInitializer.initialize(getActivity());
    this.mapView = new MapView(getActivity());
    this.mapView.onCreate(savedInstanceState);
    } catch (GooglePlayServicesNotAvailableException e) {
    Toast.makeText(getActivity(), "Please install Google Play Store and retry again!", Toast.LENGTH_LONG).show();
    getActivity().finish();
    }
    }
    @Override
    public void onResume() {
    super.onResume();
    this.mapView.onResume();
    this.handler.onMapResume(this.mapView.getMap());
    }
    @Override
    public void onPause() {
    super.onPause();
    this.mapView.onPause();
    }
    @Override
    public void onDestroy() {
    super.onDestroy();
    this.mapView.onDestroy();
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    this.mapView.onSaveInstanceState(outState);
    }
    @Override
    public void onLowMemory() {
    super.onLowMemory();
    this.mapView.onLowMemory();
    }
    @Override
    public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
    this.handler = (Handler) activity;
    } catch (ClassCastException e) {
    throw new ClassCastException("Your activity has to implement the interface " + this.handler.getClass().getName());
    }
    }
    public AppMapFragment() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_results_map, container, false);
    ((ViewGroup) rootView.findViewById(R.id.mapViewHolder)).addView(this.mapView);
    return rootView;
    }
    }
  3. 1

    Una diferencia entre MapFragment y MapView es que usted tiene que gestionar manualmente el ciclo de vida de MapView, mientras que MapFragment toma el cuidado de él por sí mismo.

    Debe llamar a los siguientes métodos de la Actividad de los padres/Fragmento de los métodos correspondientes.

    onCreate(Bundle)
    onResume()
    onPause()
    onDestroy()
    onSaveInstanceState()
    onLowMemory()

    He verificado con RawMapViewDemoActivity en muestras de Google Play Services, que se puede instalar en la sección de Extras de Android SDK Manager.

    La muestra mostró el mapa al principio, y que mostraron una página en blanco una vez me comentó el 6 líneas de mMapView.onXXX().

    Tal vez el ciclo de vida es la razón por la que la mayoría de los ejemplos que vemos en todas partes el uso de MapFragment.

    • Por qué se ha excluido MapActivity de v1 v2?
  4. 0

    Probar de esta manera:

      private MapView myMapView;   
    private GoogleMap map;  
    myMapView = (MapView) findViewById(R.id.map);     
    if (map == null) {     
    map = ((MapView) findViewById(R.id.map)).getMap();     
    }
    • Lamentablemente no funciona 🙁 da este error «01-25 16:44:20.063: E/AndroidRuntime(20332): Causada por: java.lang.ClassCastException: android.widget.FrameLayout no se puede lanzar a la com.google.android.gms.mapas.MapView» y esto apunta a la myMapView = (MapView) findViewById(R. id.el mapa); línea de
    • Me puedes decir que mínimo api estás usando ?
    • Creo que te refieres a esto? android:minSdkVersion=»9″
    • Entonces usted debe utilizar SupportMapFragment porque el MapFragment es para la api de 12 o superior. Thatz el por qué de su lanzando esta excepción.
    • Yo estoy usando el MapView, no MapFragment. Debido a que el mapa va a estar ocupando la pantalla completa, no es necesario para mí para implementar MapFragment. ¿La versión del sdk de afectar el uso de la clase MapView?
    • Intente utilizar SupportMapFragment en lugar de MapView.
    • Sí, el SDK de los efectos de la MapView thatz por qué . Creo que se debe extiende android.support.v4.app.FragmentActivity en su POnlineMapView actividad en lugar de Activity
    • Estoy realmente tratando de evitar los Fragmentos como los que no estoy familiarizado con ella… pero supongo que tengo que explorar para ver cómo funciona… Así que puedo usar MapView si extiendo Fragmento de la Actividad en su lugar?

  5. 0

    No tuve suerte con el mapa de la vista de cualquiera.

    Tuve suerte con el MapFragment.

    Intente esto:

    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.model.LatLng;
    public class TestActivity extends FragmentActivity {
    SupportMapFragment mapFragment;
    GoogleMap map;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (mapFragment == null) {
    mapFragment = new SupportMapFragment();
    getSupportFragmentManager().beginTransaction()
    .add(android.R.id.content, mapFragment).commit();
    }
    }
    @Override
    protected void onResume() {
    super.onResume();
    setupMap();
    }
    private void setupMap() {
    if (map != null)
    return;
    map = mapFragment.getMap();
    if (map == null)
    return;
    doZoom();
    }
    private void doZoom() {
    if (map != null) {
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(45.424900,
    -75.694968), 17));
    }
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here