2

设法使代码无错误,但是在启动时,我总是在行 mMap = mapFrag.getMap(); 处得到一个空指针异常;

为什么会这样?我错过了一些进口或一些步骤吗?我不确定是 SupportMapFragment 还是 GoogleMap 对象导致了问题。

package com.fragments;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

public class MapFragment extends SherlockMapFragment {

    private GoogleMap mMap;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = super.onCreateView(inflater, container, savedInstanceState);
        SupportMapFragment mapFrag= (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_map);
        mMap = mapFrag.getMap(); //null pointer is here
        return root;
    }
}

编辑:这是基于此问题here中给出的解决方案的实施的一部分

4

2 回答 2

2

请注意,您不必使用自定义Fragment子类来使用 Maps V2。如果您的片段只是纯粹的地图,您可以从活动创建MapFragmentorSupportMapFragment并在那里配置它。

您甚至不需要创建某种SherlockMapFragment地图就可以让地图成为基于 ActionBarSherlock 的应用程序的一部分。常规SupportMapFragment工作正常。

如果您确实希望在您的片段中拥有更多的业务智能,并且如果您正在使用 ActionBarSherlock,并且有问题的业务逻辑需要执行与 ActionBarSherlock 相关的事情(例如,将操作项贡献给操作栏),那么并且只有这样做你需要担心有某种SherlockMapFragment.

我可以确认这个要点包含一个工作SherlockMapFragment. 请注意,它进入了com.actionbarsherlock.app包,因为它需要对 ActionBarSherlock 的其余部分进行一些受包保护的访问。

然后,您可以对其进行子类化,例如创建一个MyMapFragment

public class MyMapFragment extends SherlockMapFragment {
  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (getMap() != null) {
      Log.d(getClass().getSimpleName(), "Map ready for use!");
    }
  }
}

你必须对调用的时间有点小心getMap()——太快了,它会返回nullonActivityCreated()似乎是一个相当安全的时间,尽管你可以自由地尝试。

然后,您只需使用MyMapFragment您会使用的任何地方SupportMapFragment

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.commonsware.android.mapsv2.sherlock.MyMapFragment"/>

这是包含上述代码的完整项目。

于 2013-01-26T19:07:05.680 回答
0

不需要实现额外的类,例如 SherlockMapFragment。您可以在 Fragment 或 SherlockFragment 类代码中处理 SupportMapFragment。看看这个

于 2013-07-23T07:13:57.453 回答