我在 onStart() 方法上得到 map object null
I get map object null on onStart() method
我在打开我的片段时尝试添加标记,所以在 onMap Ready 函数中我分配了我的地图并调用了地图 onStart() 方法但我得到了 null
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
map = mapboxMap;
}
@Override
public void onStart() {
super.onStart();
mapView.onStart();
Bundle args = getArguments();
if (args != null) {
System.out.println("MY PATROL => "+args);
mapboxAddMarker(args.getString("QRResult"));
}
}
public void mapboxAddMarker(String coords){
String[] coordArr =coords.split(" ");
LatLng coord = new LatLng();
coord.setLatitude(Double.parseDouble(coordArr[0]));
coord.setLongitude(Double.parseDouble(coordArr[1]));
map.addMarker(new MarkerOptions().position(coord));
}
此外,我知道 addMarker 已被弃用,但这是一个示例,我会修复它。
最后是我的错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rtets, PID: 10727
java.lang.NullPointerException: Attempt to invoke virtual method 'com.mapbox.mapboxsdk.annotations.Marker com.mapbox.mapboxsdk.maps.MapboxMap.addMarker(com.mapbox.mapboxsdk.annotations.MarkerOptions)' on a null object reference
at com.example.rtets.ui.fragments.MyPatrolFragment.mapboxAddMarker(MyPatrolFragment.java:83)
at com.example.rtets.ui.fragments.MyPatrolFragment.onViewCreated(MyPatrolFragment.java:96)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
at androidx.fragment.app.FragmentManager.run(FragmentManager.java:524)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8633)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
您根本无法确定 onMapReady
会在 Activity
的生命周期回调函数被调用之前被调用(例如 onStart
或 onResume
)。地图初始化是异步操作,因此您必须传递回调以在准备就绪时获取信息(就像方法说的那样)。你应该在 onMapReady
中初始化你的标记
好吧,我解决了我的问题我实现了我的片段OnMapReadyCallback
并覆盖了它,但我认为在片段中不起作用,所以我删除了 OnMapReadyCallback
并在 getMapAsync
方法
中写了 OnMapReadyCallback
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
System.out.println("MAP IS OKAY");
}
});
我在打开我的片段时尝试添加标记,所以在 onMap Ready 函数中我分配了我的地图并调用了地图 onStart() 方法但我得到了 null
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
map = mapboxMap;
}
@Override
public void onStart() {
super.onStart();
mapView.onStart();
Bundle args = getArguments();
if (args != null) {
System.out.println("MY PATROL => "+args);
mapboxAddMarker(args.getString("QRResult"));
}
}
public void mapboxAddMarker(String coords){
String[] coordArr =coords.split(" ");
LatLng coord = new LatLng();
coord.setLatitude(Double.parseDouble(coordArr[0]));
coord.setLongitude(Double.parseDouble(coordArr[1]));
map.addMarker(new MarkerOptions().position(coord));
}
此外,我知道 addMarker 已被弃用,但这是一个示例,我会修复它。
最后是我的错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.rtets, PID: 10727
java.lang.NullPointerException: Attempt to invoke virtual method 'com.mapbox.mapboxsdk.annotations.Marker com.mapbox.mapboxsdk.maps.MapboxMap.addMarker(com.mapbox.mapboxsdk.annotations.MarkerOptions)' on a null object reference
at com.example.rtets.ui.fragments.MyPatrolFragment.mapboxAddMarker(MyPatrolFragment.java:83)
at com.example.rtets.ui.fragments.MyPatrolFragment.onViewCreated(MyPatrolFragment.java:96)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
at androidx.fragment.app.FragmentManager.run(FragmentManager.java:524)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8633)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
您根本无法确定 onMapReady
会在 Activity
的生命周期回调函数被调用之前被调用(例如 onStart
或 onResume
)。地图初始化是异步操作,因此您必须传递回调以在准备就绪时获取信息(就像方法说的那样)。你应该在 onMapReady
好吧,我解决了我的问题我实现了我的片段OnMapReadyCallback
并覆盖了它,但我认为在片段中不起作用,所以我删除了 OnMapReadyCallback
并在 getMapAsync
方法
OnMapReadyCallback
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
System.out.println("MAP IS OKAY");
}
});