使用导航抽屉在片段中创建谷歌地图v2

时间:2015-08-13 09:57:55

标签: android google-maps android-fragments

我正在尝试在Fragment中创建地图,但不断收到此错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()' on a null object reference
        at com.new.newapps.activity.MapsFragment.initilizeMap(MapsFragment.java:41)
        at com.new.newapps.activity.MapsFragment.onResume(MapsFragment.java:52)

我不知道如何解决这个问题。请看下面的代码。

MapsFragment类:

public class MapsFragment extends Fragment {

public MapsFragment(){}
GoogleMap googleMap;

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

    View rootView = inflater.inflate(R.layout.fragment_distance, container, false);
    try {
        initilizeMap();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return rootView;
}

private void initilizeMap() {
    if (googleMap == null) {
        googleMap = ((SupportMapFragment) getFragmentManager()
                .findFragmentById(R.id.map))
                .getMap();
        if (googleMap == null) {
            Toast.makeText(getActivity(),
                    "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                    .show();
        }
    }
}
@Override
public void onResume() {
    super.onResume();
    initilizeMap();
    if (googleMap != null) {

    }
    CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(new LatLng(xx.xxxx, xx.xxxx))
            .zoom(10)
            .bearing(0)
            .tilt(80)
            .build();

    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

@Override
public void onDetach() {
    super.onDetach();
}
}

然后在我的布局文件中:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment"/>


</RelativeLayout>

这是我的gradle文件:

compile 'com.google.android.gms:play-services:6.5.87'

请原谅我糟糕的英语:-)

任何帮助将不胜感激!感谢

2 个答案:

答案 0 :(得分:0)

这是对this comment

的回复

基本上,人们使用SupportMapFragment#getMap()来获取GoogleMap对象已有相当长的时间。并且有太多的问题/答案/讨论/解决方法/技巧来摆脱它可能产生的NPE。

最后,Google做了一个正确的步骤,您可以在此处看到:deprecate that getMap() method and add getMapAsync() instead

因此,包含MapView/MapFragment的app / fragment必须实现com.google.android.gms.maps.OnMapReadyCallback接口,并覆盖其获取Map对象的onMapReady(GoogleMap map)。我们的想法是 GoogleMap对象需要时间进行初始化,因此如果您调用不推荐使用的getMap()方法,您获得的可能是NULL对象。它会导致NPE。所以正确的方法是同步获取它并设置回调以检索非空对象

我创建了a github repo: Google Map Practice来帮助您了解如何轻松实现这一点,并采用更好的方式。我很惊讶Android Studio默认使用不推荐的getMap()用法创建Google Map Activity(在repo中为DefaultMapsActivity)。这可能是因为他们很长时间没有更新他们的旧模板。但是,由于Google会通知您有关新API的信息,请查看。振作!

P / S:如果您想尝试我的回购,请不要忘记在/app/src/release/res/values/google_maps_api.xml以及/app/src/debug/res/values/google_maps_api.xml

中设置您的Google Api密钥

答案 1 :(得分:-1)

我认为你犯了小错误,请查看OnResume方法:

@Override
public void onResume() {
    super.onResume();
    initilizeMap();
    if (googleMap != null) {

    }
}

将此更改为,

@Override
public void onResume() {
    super.onResume();

    if (googleMap != null) {
        initilizeMap();
    }
}