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.
Beitrag das Protokoll des Fehlers –
geändert Werden Sie das Update-Methode aufrufen, bevor 'onMapReady'? Wenn ja, ist die Karte null –
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