我不想使用或延伸SupportMapFragment
或MapFragment
。我有自己的基类,里面有一堆代码。
文档明确指出,当有人单独使用MapView
时,应调用所有相应的生命周期方法(onCreate()
onResume()
等)。
Fragment
中的大多数生命周期方法与Activity
类似,但当我在Fragment
之间来回切换时,我最终会在onDestroy()
中获得混淆的NPE或者在onResume()
方法中。
所有提供的示例都使用Activity
MapView
而不是自定义Fragment
。
有人已经完成了吗?您能否在自己的MapView
课程中提供Fragment
的示例代码?
答案 0 :(得分:35)
我在PoPy的回答中苦苦挣扎,但最终我设法了,这就是我想出来的。可能这对其他人也有帮助,这也会遇到这个问题:
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声明移至新的根元素,在本例中为com.google.android.gms.maps.MapView
)。< / p>
答案 1 :(得分:13)
我成功地将MapView(v2)包含在ViewPager中嵌入的自定义片段中。在我的例子中,MapView包含在Fragment布局文件中。我不得不在MapView上调用生命周期方法(onCreate()
从片段中调用onCreateView()
),并手动调用MapsInitializer.initialize(context)
以避免来自类BitmapDescriptorFactory的NullPointerException
(以获取标记的位图)。最后一招很奇怪,我不知道为什么没有这个调用就没有正确地初始化Map系统,也许这只是当前版本中的一个bug ......
就我而言,我NullPointerException
或onResume()
中没有任何onDestroy()
。
答案 2 :(得分:-2)
虽然使用单独的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();
}