我在佈局中使用GoogleMap/MapView,但作爲視圖不是片段(因爲父級需要是片段),所以片段的佈局包括:谷歌地圖 - animateCamera()片段後無所作爲resume
<com.google.android.gms.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
片段包含此:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
<......>
initMap(bundle, mapView);
return rootView;
}
@Override
public void onResume() {
super.onResume();
MyApp.bus.register(this);
updateMapLocation(MyApp.getMostRecentLocation());
}
@Override
public void onPause() {
super.onPause();
MyApp.bus.unregister(this);
}
@Subscribe
public void locationReceived(LocationReceived m) {
Timber.i("Received bus message - Location!");
updateMapLocation(MyApp.getMostRecentLocation());
}
其母公司片段包含在此:
private MapView mapView;
private GoogleMap map;
@Override
public void onResume() {
super.onResume();
if (mapView!=null) {
mapView.onResume();
map = this.mapView.getMap();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mapView!=null) mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
if (mapView!=null) mapView.onLowMemory();
}
protected void initMap(Bundle bundle, MapView mapView) {
this.mapView = mapView;
this.mapView.onCreate(bundle);
map = this.mapView.getMap();
map.getUiSettings().setMyLocationButtonEnabled(false);
map.setMyLocationEnabled(true);
map.setBuildingsEnabled(true);
map.getUiSettings().setZoomControlsEnabled(false);
map.getUiSettings().setMyLocationButtonEnabled(true);
try {
MapsInitializer.initialize(this.getActivity());
} catch (Exception e) {
Timber.e(e, "Error initialising Google Map");
}
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(MyApp.getCentralUKLatLng(), getResources().getInteger(R.integer.map_zoom_initial));
map.animateCamera(cameraUpdate);
}
@Override
public void onPause() {
super.onPause();
if (mapView!=null) mapView.onPause();
}
protected void updateMapLocation(Location location) {
Timber.i("Moving map to a new location: " + location);
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15);
map.animateCamera(cameraUpdate);
}
新的地點正通過Otto巴士交付。上面的代碼完美地工作,但只有第一次。如果我在這個前面打開另一個片段,然後再關閉它,則該地圖無法爲後續提供的位置設置動畫。這些位置肯定會收到,animateCamera()方法肯定會被調用(使用有效的位置和縮放),但絕對沒有任何反應。沒有錯誤,沒有日誌消息,什麼都沒有。是什麼讓它更加令人憤怒的是在一個片段(這與上面的代碼相同),它恢復碎片時正常工作。
我假設我在恢復中如何對GoogeMap或MapView進行(重新)初始化時出錯,但是我通過onPause()和onResume()調用來了解MapView,我知道這是必要的。我還需要做什麼?
我認爲你已經改變了太多的代碼......該片段調用initMap,但在您稱之爲「父」片段中定義。有兩個片段?當第二張地圖關閉時,當您嘗試註冊/取消註冊時,某些內容會丟失。 – 2014-12-22 13:42:13
「...作爲視圖不是片段(因爲父級需要是片段)」爲什麼不使用嵌套片段? – peguerosdc 2014-12-27 03:36:31
@peguerosdc我認爲你不能把MapFragment放到XML佈局文件中,並將它放入一個片段中。如果你想在另一個Fragment中使用MapFragment,你必須以編程方式創建它。 – florian 2014-12-28 18:19:21