我不想使用或扩展SupportMapFragment
或MapFragment
。 我有我自己的基类,在这一串代码。
该文件明确指出,当有人使用MapView
本身,所有相应的生命周期方法( onCreate()
onResume()
等)应该被调用。
大多数的生命周期方法Fragment
类似的Activity
,但是当我来回切换之间我的Fragment
我最终得到一个模糊的NPE onDestroy()
或onResume()
方法。
所提供的所有样品使用Activity
与MapView
,但不是自定义Fragment
。
已经有人做过了吗? 你可以提供的示例代码MapView
在自己的Fragment
类?
我成功地包括MapView的(V2)在定制的片断本身嵌入在ViewPager。 就我而言,的MapView包含在片段布局文件。 我不得不呼吁MapView的生命周期方法( onCreate()
称为onCreateView()
从片段),并呼吁手动MapsInitializer.initialize(context)
,以避免NullPointerException
从类BitmapDescriptorFactory(以获取标记位图)。 这最后绝招是奇怪,我不知道为什么地图系统未正确初始化本身没有这个电话,也许它只是在目前的版本中的错误...
在我来说,我没有任何NullPointerException
中onResume()
或onDestroy()
我挣扎了一下用罂粟籽的答案,但在最后,我管理它,这里是我想出了。 也许这是帮助他人也将遇到这个问题:
public class MyMapFragment extends Fragment {
private MapView mMapView;
private GoogleMap mMap;
private Bundle mBundle;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View inflatedView = inflater.inflate(R.layout.map_fragment, container, false);
try {
MapsInitializer.initialize(getActivity());
} catch (GooglePlayServicesNotAvailableException e) {
// TODO handle this situation
}
mMapView = (MapView) inflatedView.findViewById(R.id.map);
mMapView.onCreate(mBundle);
setUpMapIfNeeded(inflatedView);
return inflatedView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBundle = savedInstanceState;
}
private void setUpMapIfNeeded(View inflatedView) {
if (mMap == null) {
mMap = ((MapView) inflatedView.findViewById(R.id.map)).getMap();
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
}
@Override
public void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
public void onDestroy() {
mMapView.onDestroy();
super.onDestroy();
}
}
这里是相应的res/layout/map_fragment.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.google.android.gms.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
可以省略RelativeLayout
(和移动的xmlns declartion到你的新的根元素,在这种情况下com.google.android.gms.maps.MapView
)如果你只有一个在你的布局就像这个例子元素。
当使用一个单独MapView
以下两件事情是至关重要的
//at Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MapsInitializer.initialize(this);
mapView.onCreate(savedInstanceState);
}
//or at Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
MapsInitializer.initialize(getActivity());
mapView.onCreate(mBundle);
}
//along with the following
@Override
protected void onResume() {
super.onResume();
if (mapView != null)
mapView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mapView != null)
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
if (mapView != null)
mapView.onLowMemory();
}