Android:Googe Map虽然已初始化,但仍为null

时间:2017-05-23 10:33:04

标签: java android google-maps nullpointerexception

我有一个带有MapView的Maps Fragment。 我在onMapReady方法中初始化了一个Google Map Object,并且我在开始时在此方法中设置的标记工作正常。但是只要我想修改标记或在另一个自定义方法中设置一个新标记,我就会得到一个NullPointerException,表示我的googleMap对象为null。这不应该是因为它已经初始化了。

非常感谢您的帮助。非常感谢你提前。

这是我的代码:

这就是我的片段活动的开头:

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;
}

这是onMapReady方法:

@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));
}

这是我的自定义用户名为method:

 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)); 
 }

所有方法都属于同一类:MapsFragment

编辑:

错误日志:

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

我的清单文件:

<?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>

编辑:

我通过将所有内容放在一个类/活动中来解决问题。然后所有的电话都运转良好。我认为问题是我创建了一个新的MapsFragment实例,在这个新实例中,全局var googleMap未定义。

非常感谢您的所有答案。

2 个答案:

答案 0 :(得分:1)

遇到同样的问题,当我将GoogleMap对象更改为静态

时,它有效

答案 1 :(得分:0)

我不知道您在哪里调用自定义方法,但您可以尝试将初始化的地图传递给您的方法,以确保您可以访问它。

试试这个:

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)); 
 }