1

當從另一個活動中打開片段時,需要恢復存儲在HashMap<String, Marker> markers; 中的標記。HashMap存儲和恢復從片段到另一活動的onSaveInstanceState

這是我的嘗試:

HashMap<String, Marker> markers; 
    //.. 

    @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //.. 
    this.markers = new HashMap<String, Marker>(); 

    // Restoring the markers on configuration changes 
      if (savedInstanceState != null) { 
       if (savedInstanceState.containsKey("markers")) { 
        markers = (HashMap<String, Marker>) savedInstanceState.getSerializable("markers"); 
        if (markers != null) { 

         for (String key : markers.keySet()) { 
          Location location = 
            new Location(markers.get(key).getPosition().latitude, markers.get(key).getPosition().longitude); 
          addMarker(key, location); 
         } 
        } 
       } 
      } 

    return rootView; 
    } 

public void addMarker(String key, Location location) { 

     //if (!key.equals(strUserID)) { 
     Marker marker = this.mGoogleMap.addMarker(new MarkerOptions() 
       .position(new LatLng(location.latitude, location.longitude)) 
       .icon(BitmapDescriptorFactory.defaultMarker())); 
} 

    //... 

    @Override 
     public void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      outState.putSerializable("markers", markers); 
     } 

我想,當片段是從另一個活動暫停狀態恢復的片段,以恢復標記。 例如:活動A包含片段FA從活動B被稱爲前景然後回再次按片段FA被打開:

 Activity A (Fragment FA)(Markers shown on map and should store hashmap `onSaveInstanceState(Bundle outState)` when while activity B is called) ---> Activity B ---> (On Back-pressed restore markers from hashmap `if (savedInstanceState != null)`) Fragment FA. 
+0

你能否讓這個問題更準確? –

+0

@NirDuan我想做類似Activity A(Fragment FA)的東西(地圖上顯示的標記,並且在調用Activity B時應該存儲hashmap'onSaveInstanceState(Bundle outState)')---> Activity B --->(Back - 按下)在片段FA恢復'if(savedInstanceState!= null)'上再次恢復hashmap標記。 – Bhushan

回答

1

請注意,如果:

  • A不打電話finish當您切換到B
  • A被配置爲留在後面,堆
  • FA被配置爲保持在背堆棧

然後,當你切換到B,然後按回,AFA會從後堆棧,這意味着你讓他們恰好在切換到B他們是相同的狀態被彈出。在這種情況下,您無需執行任何操作 - 您的HashMap仍然有效並保留正確的內容。

但是,如果系統需要內存,它可能會決定銷燬「back-stacked」ActivityFragment實例,在這種情況下,它會在銷燬之前調用onSaveInstanceState。如果你現在回去,那麼AFA將被重新創建,並將收到savedInstanceState參數包含保存狀態。只要用它來恢復任何你想要的。

實際上,(假設Marker類正確實施)我覺得你的代碼是好的,但一個行onCreateView

this.markers = new HashMap<String, Marker>(); 

如果FA距離回彈出堆棧(而不是重新創建) ,此行會導致您丟失HashMap的當前狀態。我建議你把這一行放在onCreate,或者簡單地聲明後初始化這張地圖:

private HashMap<String, Marker> markers = new HashMap<>(); 
+0

@非常感謝你,我在聲明本身初始化了HashMap,並且它工作正常,並且在代碼中出現錯誤,正在清理片段的hashmap onStop()。 – Bhushan

+0

@Bhushan,很高興它幫助你。如果這完全解決了您的問題,請接受答案 – Vasiliy

相關問題