2014-12-01 41 views
2

我在佈局中使用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,我知道這是必要的。我還需要做什麼?

+0

我認爲你已經改變了太多的代碼......該片段調用initMap,但在您稱之爲「父」片段中定義。有兩個片段?當第二張地圖關閉時,當您嘗試註冊/取消註冊時,某些內容會丟失。 – 2014-12-22 13:42:13

+0

「...作爲視圖不是片段(因爲父級需要是片段)」爲什麼不使用嵌套片段? – peguerosdc 2014-12-27 03:36:31

+0

@peguerosdc我認爲你不能把MapFragment放到XML佈局文件中,並將它放入一個片段中。如果你想在另一個Fragment中使用MapFragment,你必須以編程方式創建它。 – florian 2014-12-28 18:19:21

回答

2

這是因爲您沒有在onResume()中編寫代碼。 看到當你打開和關閉第二個片段時,第一個片段將始終停留在那裏,所以當第二個片段關閉時,第一個片段的onResume()將被調用。 所以你必須在onResume()中設置動畫。

+0

我不認爲這是正確的。我已確認onResume()未被調用並檢查文檔,這是此場景中的正確行爲。我打開包含地圖的片段,然後打開另一個片段,然後關閉第二個片段。我的地圖片段再次變得可見,但onResume()未被調用,我期望這是地圖無法正常工作。只有在調用Activity onResume時纔會調用onResume,而不是因爲兩個片段都在同一個活動中。 – 2014-12-23 14:03:14

+0

對於慢速回復以及我未能管理賞金表示真誠的歉意,我無法上網。我將你的答案標記爲正確,因爲它將我引向解決方案。問題在於onResume沒有被調用,因爲如果在Activity上調用了onResume,則onResume只能在片段上調用。在這種情況下,有一個活動,兩個片段,並且活動沒有恢復,片段也沒有。 – 2015-01-05 10:37:44