设法使代码没有错误,但是在启动时,我不知何故总是在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;
}
}
编辑:这是基于此问题中给出的解决方案的实现的一部分
请注意,使用Maps V2不一定需要使用自定义Fragment
子类。如果您的片段只是纯粹的地图,则可以从活动创建MapFragment
或SupportMapFragment
并在其中进行配置。
您甚至不需要创建某种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()
的时间上小心一点 - 太快,它会返回null
。 onActivityCreated()
似乎是一个相当安全的时间,尽管您可以自由地进行实验。
然后,您只需在SupportMapFragment
任何使用MyMapFragment
<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"/>
这是包含上述代码的完整项目。
不需要实现一个额外的类,如SherlockMapFragment。您可以在片段或 SherlockFragment 类代码中处理 SupportMapFragment。看看这个。