【问题标题】:Add a marker to a dynamic Google Map向动态 Google 地图添加标记
【发布时间】:2015-03-01 11:32:17
【问题描述】:

我正在开发一个显示具有指定 LatLng 值的地图的应用程序。 地图片段是动态的(不是 R.id.map)

当我尝试将标记添加到指定位置(我从 Google Places API JSON 请求中获取)时,我得到一个空指针异常。

这是代码:

        @Override
public void initMap(int position, long id, ListView listView) {
    Cursor cursor = (Cursor) listView.getItemAtPosition(position);
    String lat = cursor.getString(cursor.getColumnIndexOrThrow(PlacesContract.Places.LAT));
    String lng = cursor.getString(cursor.getColumnIndexOrThrow(PlacesContract.Places.LNG));
    String name = cursor.getString(cursor.getColumnIndexOrThrow(PlacesContract.Places.NAME));
    LatLng latLng = new LatLng(Double.parseDouble(lat), Double.parseDouble(lng));
    GoogleMapOptions options = new GoogleMapOptions();

    options.mapType(GoogleMap.MAP_TYPE_HYBRID);

    options.camera(CameraPosition.fromLatLngZoom(latLng, 15));

    mapFragment = GoogleMapFragment.newInstance(options);
    mUIGoogleMap.addMarker(new MarkerOptions().position(latLng).title(name));
    if (findViewById(R.id.map_container) != null) {
        getSupportFragmentManager().beginTransaction().replace(R.id.map_container, mapFragment).addToBackStack(null).commit();
    } else {
        getSupportFragmentManager().beginTransaction().replace(R.id.listview_container, mapFragment).addToBackStack(null).commit();

}
}

GoogleMapFragment 类 =

public class GoogleMapFragment extends SupportMapFragment {

private static final String SUPPORT_MAP_BUNDLE_KEY = "MapOptions";

public static interface OnGoogleMapFragmentListener {
    void onMapReady(GoogleMap map);
}

public static GoogleMapFragment newInstance() {
    GoogleMapFragment fragment = new GoogleMapFragment();
    return fragment;
}

public static GoogleMapFragment newInstance(GoogleMapOptions options) {
    Bundle arguments = new Bundle();
    arguments.putParcelable(SUPPORT_MAP_BUNDLE_KEY, options);

    GoogleMapFragment fragment = new GoogleMapFragment();
    fragment.setArguments(arguments);
    return fragment;
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mCallback = (OnGoogleMapFragmentListener) getActivity();
    } catch (ClassCastException e) {
        throw new ClassCastException(getActivity().getClass().getName() + " must implement OnGoogleMapFragmentListener");
    }
}

@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
    View v = super.onCreateView(arg0, arg1, arg2);
    Fragment fragment = getParentFragment();
    return v;
}

private OnGoogleMapFragmentListener mCallback;

}

错误日志:

03-01 13:40:36.069  17720-17720/com.fragments.ofir.nearby E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.fragments.ofir.nearby, PID: 17720
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference
        at com.fragments.ofir.nearby.MainActivity.initMap(MainActivity.java:184)
        at com.fragments.ofir.nearby.fragments.ResultsFragment.onItemClick(ResultsFragment.java:113)
        at android.widget.AdapterView.performItemClick(AdapterView.java:300)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1186)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3095)
        at android.widget.AbsListView$3.run(AbsListView.java:4038)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5274)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

【问题讨论】:

  • 你的 latLng 是否正确(不是 null)?你能发布你的错误日志吗?
  • @Sadiq 我已将错误日志添加到问题中,是的,我得到了正确的 LatLng,没有 addmarker() 方法,地图工作得很好。
  • @Ofir 你能告诉我哪一行是 184 吗?
  • mapFragment.getMap().addMarker(new MarkerOptions().position(latLng)); @Arshdeep_somal

标签: android google-maps google-play-services marker supportmapfragment


【解决方案1】:

您应该尝试扩展 SupportMapFragment 类,而不是创建新的 SupportMapFragment 实例。检查this

【讨论】:

  • 仍然得到空指针。所有工作都可以使用标记。我将 GoogleMapFragment 自定义类添加到原始问题中。
  • 我已经设法通过使用全局变量来做到这一点,并在 OnMapReady 回调上添加标记。没有更好的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多