2013-03-01 13 views
5

Sto riscontrando un piccolo problema nell'implementazione della mappa in fragment. Di seguito è riportato il mio codice.Mapapi v2 in Android che causa un errore nel frammento

import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.tfick.android.R; 

public class PoiFragment extends Fragment{ 

private GoogleMap mGoogleMap; 

private static final LatLng SYDNEY = new LatLng(23.03,72.62); 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View v=inflater.inflate(R.layout.poi_fragment, container,false); 


    MapFragment mMapFragment = MapFragment.newInstance(); 
    FragmentTransaction fragmentTransaction = 
      getFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.container1, mMapFragment); 
    fragmentTransaction.commit(); 

    if(mGoogleMap ==null){ 

      /*initializing map */ 

      mGoogleMap=mMapFragment.getMap(); 

      /*cretaing custom camera position*/ 

      CameraPosition mCameraPosition=new CameraPosition.Builder().target(SYDNEY).bearing(0).tilt(30).build(); 

      /*setting custom camera position*/ 

      mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition)); 

      /*adding custom marker on the map.*/ 
      mGoogleMap.addMarker(new MarkerOptions().draggable(true).position(new LatLng(22.03, 72.56)).title("hello world").snippet("Ahmedabad").icon(BitmapDescriptorFactory.fromResource(R.drawable.wifi))); 

      mGoogleMap.addMarker(new MarkerOptions().draggable(true).position(new LatLng(23.03, 78.10)).title("hello world").snippet("Baroda").icon(BitmapDescriptorFactory.fromResource(R.drawable.wifi))); 

     } 

     if(mGoogleMap !=null){ 


      /* map is already initialized then setting map type */ 
      /* 
      * normal 
      * satellite 
      * hybrid 
      * terrain 
      * none 
      */ 
      mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

     } 

    return v; 
} 
} 
03-01 12:15:31.439: E/AndroidRuntime(9299): FATAL EXCEPTION: main 
03-01 12:15:31.439: E/AndroidRuntime(9299): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tfick.android/com.tfick.android.PointOfIntrest}: java.lang.NullPointerException: CameraUpdateFactory is not initialized 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.ActivityThread.access$600(ActivityThread.java:140) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.os.Looper.loop(Looper.java:137) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at dalvik.system.NativeStart.main(Native Method) 
03-01 12:15:31.439: E/AndroidRuntime(9299): Caused by: java.lang.NullPointerException: CameraUpdateFactory is not initialized 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at com.google.android.gms.internal.at.a(Unknown Source) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at com.google.android.gms.maps.CameraUpdateFactory.J(Unknown Source) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at com.google.android.gms.maps.CameraUpdateFactory.newCameraPosition(Unknown Source) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at com.tfick.fragment.PoiFragment.onCreateView(PoiFragment.java:51) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.BackStackRecord.run(BackStackRecord.java:635) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.Activity.performStart(Activity.java:5215) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073) 
03-01 12:15:31.439: E/AndroidRuntime(9299):  ... 11 more 

risposta

0

Inizializzare il CameraUpdateFactory.
Come da documentazione -
Chiama inizializza (Contesto). Finché non viene generato un valore di GooglePlayServicesNotAvailableException, questa classe verrà inizializzata correttamente.

Link-
http://developer.android.com/reference/com/google/android/gms/maps/MapsInitializer.html#initialize(android.content.Context)
Come inizializzare -

try { 
    MapsInitializer.initialize(this /*the context*/); 
} catch (GooglePlayServicesNotAvailableException e) { 
    e.printStackTrace(); 
} 

Riferimento - mapview and cameraupdate in api v2

+0

sta mostrando errore nella CameraPosition mCameraPosition = new CameraPosition.Builder() di destinazione (SYDNEY) .bearing (0) .tilt (30) .build(); – Bug

+0

Hai provato a chiamare l'inizializzazione? – Anukool

+0

quando commento che se le condizioni non mostrano errori e la mappa si carica come un incantesimo ma quando la uso, se le condizioni mostra un errore. e non sto usando mapview sto usando mapFragment – Bug

0

Il problema è che i rendimenti getMap()null e quindi CameraUpdateFactory getta le eccezioni, come ha bisogno di un inizializzato GoogleMap.

Ho avuto un problema simile quando si utilizza un MapFragment all'interno di un Fragment. L'ho risolto spostando l'inizializzazione della mappa su OnResume.

+0

Funziona anche in emulatore? – Nabin

1

Grazie a me trovo la soluzione se uno qualsiasi ha lo stesso problema usa il seguente codice.

import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.tfick.android.R; 

public class PoiFragment extends MapFragment { 
    /*object of google map*/ 
    public GoogleMap mGoogleMap; 
    /* summy location*/ 
    private static final LatLng SYDNEY = new LatLng(23.03, 72.62); 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onActivityCreated(savedInstanceState); 

     if (getMap() != null) { 
      Log.d(getClass().getSimpleName(), "Map ready for use!"); 

      mGoogleMap = getMap(); 

      /* cretaing custom camera position */ 

      CameraPosition mCameraPosition = new CameraPosition.Builder() 
        .target(SYDNEY).bearing(0).tilt(30).build(); 
      Log.i("gmap", mGoogleMap.toString()); 

      /* setting custom camera position */ 

      mGoogleMap.animateCamera(CameraUpdateFactory 
        .newCameraPosition(mCameraPosition)); 

      /* adding custom marker on the map. */ 
      mGoogleMap 
        .addMarker(new MarkerOptions() 
          .draggable(true) 
          .position(new LatLng(22.03, 72.56)) 
          .title("hello world") 
          .snippet("Ahmedabad") 
          .icon(BitmapDescriptorFactory 
            .fromResource(R.drawable.wifi))); 

      mGoogleMap 
        .addMarker(new MarkerOptions() 
          .draggable(true) 
          .position(new LatLng(23.03, 78.10)) 
          .title("hello world") 
          .snippet("Baroda") 
          .icon(BitmapDescriptorFactory 
            .fromResource(R.drawable.wifi))); 

     } 

    } 

} 
+1

Questa non è una risposta @Bug, hai incollato l'intera attività qui. Prova a rimuovere le parti non pertinenti, in questo modo anche gli altri possono usarle e prevederti. –

0

L'implementazione mappa di Google si basa molto su diversi metodi del ciclo di vita (onCreate, onCreateView, OnDestroy, onResume e onPause). Dovresti inoltrare queste chiamate al MapFragment se lo incapsuliamo nel tuo frammento. La mappa dovrebbe essere già inizializzata dopo aver chiamato mapView.getMap() e ottenere un GoogleMap in cambio.

Se si ottiene nulla da getMap() parecchie cose che sarebbe potuto accadere:

  • Non hai chiamato onCreate e/o onCreateView sul MapFragment (chiamata getMap() dopo quei metodi)
  • È mancano l'OpenGL ES 2 caratteristica voce nel manifesto
  • ti manca le autorizzazioni necessarie per le mappe
  • Google Play Services SDK non sono installati sul dispositivo o sono troppo vecchi

Ho letto sulla soluzione di inizializzazione (questa) abbastanza spesso qui su StackOverflow ma in realtà non è necessaria nella maggior parte dei casi.

EDIT: Ho appena visto che si sta aggiungendo il Mapfragment attraverso una transazione. Hai considerato di utilizzare solo un MapView invece all'interno di Poi Frammentazione? Credo che utilizzando MapFragment e aggiungendolo attraverso una transazione si ottenga un problema di temporizzazione. La transazione non è probabilmente finita mentre si è ancora nel metodo PoiFragment.onCreateView (quindi Maps non è ancora inizializzato).Potresti provare a utilizzare su Riduci ma dovresti assicurarti di aver avviato il codice della mappa solo una volta, in quanto il risultato verrà chiamato più spesso.

I miei suggerimenti in termini di architettura:

  • Usa MapFragment direttamente all'interno della vostra attività, se questo è fattibile
  • estendere la Mapfragment se avete abbastanza il codice per mettere in là
0

ho affrontato esattamente lo stesso problema. Questo errore si verifica quando getMap() restituisce null. .

ho fatto la seguente:

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
googleMap = mapFragment.getMap(); 

/* if googleMap == null then there may be following problem : 
* 1. google play service version are not matching on both device and installed apk.Will show update message on map. 
* 2. No google play service installed. Will show a install message on map. 
*/ 
if (googleMap != null) { 
    LatLng iniLoc = new LatLng(44.97651081283853, -93.2245754142059); 
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(iniLoc)); 
    googleMap.getUiSettings().setZoomGesturesEnabled(false); 
    currentMarkerOption = new MarkerOptions(); 
    currentMarkerOption.position(iniLoc); 
    currentMarker = googleMap.addMarker(currentMarkerOption); 
    currentMarker.setIcon((BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))); 
    currentMarker.setTitle("Current Position"); 
    currentMarker.showInfoWindow(); 
    currentMarker.setVisible(false); 
    initDestinationMarker(); 
} 
Problemi correlati