我努力使用谷歌地图Android API
情况是:我有一个父片段,它包含对MapFragment的引用。 我的目标是在地图上添加一些标记。
MapFragment总是在onViewCreated方法中返回null,这是预期的,因为此时mapFragment布局可能尚未完全加载。
void onViewCreated(){
GoogleMap sMap = mapFragment.getMap(); //<---- always return null
// add markers
//.....
}
我试图将MapFragment.getMap()放在AysnkTask中并使用while循环来尝试保存对地图的引用,但它不起作用。发生了一个奇怪的例外。
void onViewCreated(){
AsyncTask<Object, Object, GoogleMap> loadInstruction = new AsyncTask<Object, Object, GoogleMap>(){
@Override
protected GoogleMap doInBackground(Object... params) {
GoogleMap sMap = mapFragment.getMap();
while(sMap == null) {
sMap = mapFragment.getMap();
}
return sMap;
}
@Override
protected void onPostExecute(GoogleMap result) {
//add Markers
//......
}
};
loadInstruction.execute();
例外
06-23 11:28:05.754: I/dalvikvm(4129): Jit: resizing JitTable from 4096 to 8192
06-23 11:28:05.754: I/dalvikvm(4129): Jit: resizing JitTable from 4096 to 8192
06-23 11:28:05.764: E/AndroidRuntime(4129): FATAL EXCEPTION: main
06-23 11:28:05.764: E/AndroidRuntime(4129): Process: com.wenchao.map, PID: 4129
06-23 11:28:05.764: E/AndroidRuntime(4129): java.lang.NullPointerException
06-23 11:28:05.764: E/AndroidRuntime(4129): at kbh.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at mbi.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at lxn.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at lxm.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at fnb.onTransact(SourceFile:107)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.os.Binder.transact(Binder.java:361)
06-23 11:28:05.764: E/AndroidRuntime(4129): at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at com.google.android.gms.maps.SupportMapFragment$a.onCreateView(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at com.google.android.gms.dynamic.a$4.b(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at com.google.android.gms.dynamic.a.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at com.google.android.gms.dynamic.a.onCreateView(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.os.Handler.handleCallback(Handler.java:733)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.os.Handler.dispatchMessage(Handler.java:95)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.os.Looper.loop(Looper.java:136)
06-23 11:28:05.764: E/AndroidRuntime(4129): at android.app.ActivityThread.main(ActivityThread.java:5001)
06-23 11:28:05.764: E/AndroidRuntime(4129): at java.lang.reflect.Method.invokeNative(Native Method)
06-23 11:28:05.764: E/AndroidRuntime(4129): at java.lang.reflect.Method.invoke(Method.java:515)
06-23 11:28:05.764: E/AndroidRuntime(4129): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-23 11:28:05.764: E/AndroidRuntime(4129): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-23 11:28:05.764: E/AndroidRuntime(4129): at dalvik.system.NativeStart.main(Native Method)
06-23 11:28:06.914: I/Process(4129): Sending signal. PID: 4129 SIG: 9
因为getMap()不能保证在任何时候都返回一个map引用,并且没有钩子方法或某个地方让我注册一个回调。并且似乎不允许使用后台异步任务,如何确定何时调用getMap()并获取地图引用?
答案 0 :(得分:2)
在onCreateView上包含以下片段,这将解决您的问题,
SupportMapFragment mFragment;
mFragment = new SupportMapFragment() {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if ((map = mFragment.getMap()) != null) {
setUpMap();
}
}
};
准备好地图后,将调用SuppotMapFragment的onActivityCreated,您可以设置地图。
希望这有帮助
答案 1 :(得分:0)
Google map v2 android method getMap() returns null
上述链接中的解决方案对我有用。 虽然我没有找到文档说getMap()将garautuee在onActivityCreated中返回一个有用的地图引用,但调用getMap似乎有效。