2013-03-01 4 views
5

Ich habe wenig Problem bei der Kartenimplementierung in fragment. Unten ist mein Code.Mapapi v2 in android verursacht Fehler in Fragment

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 

Antwort

0

die CameraUpdateFactory initialisieren.
Gemäß der Dokumentation -
Anruf initialisieren (Kontext). Solange keine GooglePlayServicesNotAvailableException ausgelöst wird, wird diese Klasse korrekt initialisiert.

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

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

Referenz - mapview and cameraupdate in api v2

+0

es Fehler in Camera mCameraPosition = new CameraPosition.Builder() Ziel (SYDNEY) .bearing (0) .tilt (30) .build() zeigt; – Bug

+0

Haben Sie versucht, initialisieren aufzurufen? – Anukool

+0

wenn ich kommentiere, dass wenn Bedingungen es keinen Fehler zeigt und Karte Last wie ein Charme, aber wenn ich das benutze, wenn Bedingungen Fehler zeigt. und ich verwende nicht mapview ich verwende mapFragment – Bug

0

Das Problem ist, dass getMap() kehrt null und damit CameraUpdateFactory die Ausnahmen wirft, wie es initialisierter braucht GoogleMap.

Ich hatte ein ähnliches Problem bei der Verwendung einer MapFragment innerhalb einer Fragment. Ich löste es, indem ich die Karteninitialisierung zu OnResume verschiebe.

+0

Funktioniert es sogar im Emulator? – Nabin

1

Dank mir finde ich die Lösung wenn einmal dasselbe Problem folgenden Code verwenden.

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

Dies ist keine Antwort @Bug, Sie haben Ihre gesamte Aktivität hier eingefügt. Versuchen Sie, irrelevante Teile zu entfernen, so dass andere sie auch verwenden können. –

0

der Google Map Implementierung stützt sich stark auf mehrere Lebenszyklusmethoden (onCreate, onCreateView, onDestroy, onResume und onPause). Sie sollten diese Aufrufe an das MapFragment weiterleiten, wenn Sie es in Ihrem eigenen Fragment einkapseln. Die Karte sollte bereits nach dem Aufruf von mapView.getMap() initialisiert werden und eine GoogleMap als Gegenleistung erhalten.

Wenn Sie von getMap null get() mehrere Dinge passiert sein könnte:

  • Sie rufen nicht onCreate und/oder onCreateView auf der MapFragment (Call getMap() nach diesen Methoden)
  • Sie fehlt die OpenGL eS 2 Feature Eintrag in Ihrem Manifest
  • Sie fehlen die erforderlichen Berechtigungen für Karten
  • Google SDK Play-Dienste werden auf dem Gerät installiert oder sie sind zu alt

Ich lese ziemlich oft über die Initialize (this) Lösung hier auf StackOverflow, aber es wird in den meisten Fällen tatsächlich nicht benötigt.

EDIT: Ich habe gerade gesehen, dass Sie das Mapfragment durch eine Transaktion hinzufügen. Haben Sie darüber nachgedacht, stattdessen nur ein MapView in Ihrem PoiFragment zu verwenden? Ich glaube, dass bei der Verwendung von MapFragment und dem Hinzufügen durch eine Transaktion ein Zeitproblem auftritt. Die Transaktion ist wahrscheinlich nicht beendet, während Sie sich noch in Ihrer PoiFragment.onCreateView-Methode befinden (daher wird Maps noch nicht initialisiert).Sie könnten versuchen, onResume zu verwenden, aber Sie müssten sicherstellen, dass Sie Ihren Map-Code nur einmal initialisieren, da onResume öfter aufgerufen wird.

Meine Vorschläge in Bezug auf die Architektur:

  • Verwenden MapFragment innerhalb Ihrer Aktivität direkt, ob das machbar ist
  • die MapFragment verlängern, wenn Sie genug Code haben dort
0

zu setzen konfrontiert I genau dasselbe Problem.Dieser Fehler passiert, wenn getMap()null zurückgibt. .

habe ich folgendes:

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(); 
} 
Verwandte Themen