我有一个扩展SupportMapFragment的片段。
public class PlaceMapsFragment extends SupportMapFragment {
private GoogleMap mMap;
private LatLng mPosFija;
public PlaceMapsFragment() {
super();
}
public static PlaceMapsFragment newInstance(LatLng posicion) {
PlaceMapsFragment frag = new PlaceMapsFragment();
frag.mPosFija = posicion;
return frag;
}
@Override
public GoogleMap getMap() {
// TODO Auto-generated method stub
return super.getMap();
}
@Override
public void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
//initMap();
return view;
}
private void initMap() {
UiSettings settings = getMap().getUiSettings();
settings.setAllGesturesEnabled(false);
settings.setMyLocationButtonEnabled(false);
getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(mPosFija, 16));
getMap().addMarker(
new MarkerOptions().position(mPosFija)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.marker)));
}
}
现在我想引用自动生成的MapView,以便我可以将我的功能添加到地图中。
当我尝试initMap();
时,我得到NullPointerException
错误:
12-10 02:54:20.171: E/AndroidRuntime(4339): FATAL EXCEPTION: main
12-10 02:54:20.171: E/AndroidRuntime(4339): java.lang.NullPointerException
12-10 02:54:20.171: E/AndroidRuntime(4339): at maps.ar.b.a(Unknown Source)
12-10 02:54:20.171: E/AndroidRuntime(4339): at maps.y.h.a(Unknown Source)
12-10 02:54:20.171: E/AndroidRuntime(4339): at maps.y.au.a(Unknown Source)
12-10 02:54:20.171: E/AndroidRuntime(4339): at maps.y.ae.moveCamera(Unknown Source)
12-10 02:54:20.171: E/AndroidRuntime(4339): at com.google.android.gms.maps.internal.IGoogleMapDelegate$Stub.onTransact(IGoogleMapDelegate.java:83)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.os.Binder.transact(Binder.java:297)
12-10 02:54:20.171: E/AndroidRuntime(4339): at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.moveCamera(Unknown Source)
12-10 02:54:20.171: E/AndroidRuntime(4339): at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source)
12-10 02:54:20.171: E/AndroidRuntime(4339): at com.m7.nomad.PlaceMapsFragment.initMap(PlaceMapsFragment.java:55)
12-10 02:54:20.171: E/AndroidRuntime(4339): at com.m7.nomad.PlaceMapsFragment.onCreateView(PlaceMapsFragment.java:46)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
12-10 02:54:20.171: E/AndroidRuntime(4339): at com.m7.nomad.PlaceActivity$TabManager.onTabChanged(PlaceActivity.java:153)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:379)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.widget.TabHost.setCurrentTab(TabHost.java:364)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.view.View.performClick(View.java:3591)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.view.View$PerformClick.run(View.java:14263)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.os.Handler.handleCallback(Handler.java:605)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.os.Handler.dispatchMessage(Handler.java:92)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.os.Looper.loop(Looper.java:137)
12-10 02:54:20.171: E/AndroidRuntime(4339): at android.app.ActivityThread.main(ActivityThread.java:4507)
12-10 02:54:20.171: E/AndroidRuntime(4339): at java.lang.reflect.Method.invokeNative(Native Method)
12-10 02:54:20.171: E/AndroidRuntime(4339): at java.lang.reflect.Method.invoke(Method.java:511)
12-10 02:54:20.171: E/AndroidRuntime(4339): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
12-10 02:54:20.171: E/AndroidRuntime(4339): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-10 02:54:20.171: E/AndroidRuntime(4339): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:8)
这是一种预期的行为。
您只有在片段经过getMap()
后才能致电onCreateView()
,否则会给您null
。如果Google Play服务不可用,您还可以收到null
。
换句话说,请在initMap()
中致电onResume()
。
您可以查看更多here。
希望它有所帮助!
答案 1 :(得分:6)
我终于解决了它,你不必覆盖getMap()
而你不需要mMap变量,GoogleMap也包含在类中。最后,您需要在onResume:
public class PlaceMapsFragment extends SupportMapFragment {
private LatLng mPosFija = new LatLng(37.878901,-4.779396);
public PlaceMapsFragment() {
super();
}
public static PlaceMapsFragment newInstance(LatLng posicion) {
PlaceMapsFragment frag = new PlaceMapsFragment();
frag.mPosFija = posicion;
return frag;
}
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
initMap();
}
@Override
public void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
//initMap();
return view;
}
private void initMap() {
UiSettings settings = getMap().getUiSettings();
settings.setAllGesturesEnabled(false);
settings.setMyLocationButtonEnabled(false);
getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(mPosFija, 16));
getMap().addMarker(
new MarkerOptions().position(mPosFija)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.marker)));
}
}
希望它能帮助其他人开始使用google maps api的v2(就像我:D)。
答案 2 :(得分:0)
问题出在onCreateView上。你忘了打电话给super.onCreateView()。查看this