2017-05-23 5 views
1

Ich habe ein Maps-Fragment mit einem MapView innerhalb. Ich initialisiere ein Google Map Objekt in der onMapReady Methode und der Marker, den ich in dieser Methode am Anfang gesetzt habe, funktioniert einwandfrei. Aber sobald ich die Markierung ändern oder eine neue in einer anderen benutzerdefinierten Methode festlegen möchte, erhalte ich eine NullPointerException, die besagt, dass mein googleMap-Objekt null ist. Was es nicht daran liegen sollte, dass es bereits initialisiert wurde.Android: Googe Map ist null, obwohl initialisiert

Ihre Hilfe würde sehr geschätzt werden. Vielen Dank im Voraus.

Hier ist mein Code:

Dies ist, was der Anfang ofmy Fragment Aktivität wie folgt aussieht:

public class MapsFragment extends Fragment implements OnMapReadyCallback { 

MapView mMapView; 
private GoogleMap googleMap; 

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

    View rootView = inflater.inflate(R.layout.fragment_maps, container, false); 

    mMapView = (MapView) rootView.findViewById(R.id.mapView); 
    mMapView.onCreate(savedInstanceState); 

    mMapView.onResume(); // needed to get the map to display immediately 

    try { 
     MapsInitializer.initialize(getActivity().getApplicationContext()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    mMapView.getMapAsync(this); 

    return rootView; 
} 

Dies ist die onMapReady Methode:

@Override 
public void onMapReady(GoogleMap gMap) { 
    // The global variable googleMap gets initialised 
    googleMap = gMap; 
    LatLng sydney = new LatLng(-33.852, 151.211); 
    googleMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
} 

Das ist meine benutzerdefinierte Methode aufgerufen wird :

public void updateCamera(String search_string) { 

    LatLng search_string_place = new LatLng(-37.9712371, 144.4927088); 

    // THIS is where the NullPointer exception happens for the first time 
    googleMap.addMarker(new 
    MarkerOptions().position(search_string_place).title(Melbourne)); 

    googleMap.moveCamera(CameraUpdateFactory.newLatLng(search_string_place)); 
} 

Alle Methoden sind in der gleichen Klasse: MapsFragment

Edit:

Fehlerprotokoll:

FATAL EXCEPTION: main 
Process: <packagename>, PID: 26556 
java.lang.IllegalStateException: Could not execute method of the activity 
    at android.view.View$1.onClick(View.java:3830) 
    at android.view.View.performClick(View.java:4445) 
    at android.view.View$PerformClick.run(View.java:18446) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5146) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at android.view.View$1.onClick(View.java:3825) 
    ... 11 more 
Caused by: java.lang.NullPointerException 
    at <packagename>.MapsFragment.updateCamera(MapsFragment.java:134) 
    at <packagename>.MainActivity.callUpdateCamera(MainActivity.java:46) 
    ... 14 more 

Mein Manifest-Datei:

<?xml version="1.0" encoding="utf-8"?> 

<!-- 
    The ACCESS_COARSE/FINE_LOCATION permissions are not required to use 
    Google Maps Android API v2, but you must specify either coarse or fine 
    location permissions for the 'MyLocation' functionality. 
--> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" 
    android:name="android.support.multidex.MultiDexApplication"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <!-- 
     The API key for Google Maps-based APIs is defined as a string resource. 
     (See the file "res/values/google_maps_api.xml"). 
     Note that the API key is linked to the encryption key used to sign the APK. 
     You need a different API key for each encryption key, including the release key that is used to 
     sign the APK for publishing. 
     You can define the keys for the debug and release targets in src/debug/ and src/release/. 
    --> 
    <meta-data 
     android:name="com.google.android.geo.API_KEY" 
     android:value="@string/google_maps_key" /> 

</application> 

EDIT:

Ich löste das Problem, indem sie einfach alles in einer Klasse/Tätigkeit setzen. Dann haben alle Anrufe gut funktioniert. Ich denke, das Problem war, dass ich eine neue Instanz von MapsFragment erstellte und in dieser neuen Instanz die globale Variable googleMap nicht definiert war.

Vielen Dank für alle Antworten.

+0

Beitrag das Protokoll des Fehlers –

+1

geändert Werden Sie das Update-Methode aufrufen, bevor 'onMapReady'? Wenn ja, ist die Karte null –

+0

Nein, ich denke nicht, weil die Methode durch Drücken einer Taste aufgerufen wird, und ich drücke die Taste, nachdem die erste Markierung sichtbar ist. – s137

Antwort

0

Ich weiß nicht, wo Sie Ihre benutzerdefinierte Methode aufrufen, aber Sie könnten versuchen, die initialisierte Karte an Ihre Methode zu übergeben, um sicherzustellen, dass Sie darauf zugreifen können.

Try this:

public void updateCamera(String search_string, GoogleMap googleMap) { 

    LatLng search_string_place = new LatLng(-37.9712371, 144.4927088); 

    // THIS is where the NullPointer exception happens for the first time 
    googleMap.addMarker(new 
    MarkerOptions().position(search_string_place).title(Melbourne)); 

    googleMap.moveCamera(CameraUpdateFactory.newLatLng(search_string_place)); 
} 
+0

Das ist eine gute Idee, aber leider ist das nicht wirklich eine Option, da ich die Methode von einer anderen Aktivität aus aufrufen, von der ich keinen direkten Zugriff auf die Karte habe. Nur die Methode, die ich anrufe, hat Zugriff. – s137

+0

ich die Methode von innerhalb meiner Haupttätigkeit aufrufen, indem Sie eine Instanz der MapsFragment Klasse wie folgt zu schaffen: 'public class MainActivity FragmentActivity erstreckt { MapsFragment mf = new MapsFragment();' gleich zu Beginn des MainActivity , dann später dann eine Taste gedrückt wird, rufe ich 'mf.callUpdateCamera (..)' Kann dies die Ursache des Fehlers sein? – s137

+0

post voller Code bitte –

1

hatte das gleiche Problem, es funktionierte, als ich GoogleMap Objekt statisch

Verwandte Themen