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は活動Bが再び断片FAが開かれたバックプレスに前景に呼び出されるからフラグメント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アクティビティA(フラグメントFA)(マーカーが地図上に表示され、アクティビティBが呼び出されたときにハッシュマップ 'onSaveInstanceState(Bundle outState) 'を保存する必要があります)--->アクティビティB --->(戻る-pressed)フラグメントFA上でハッシュマップマーカーを再び復元する 'if(savedInstanceState!= null)'を再開する。 – Bhushan

答えて

1

場合ことに注意してください:

  • Aはありませんあなたは
  • FAがバックに残るように構成されてバックスタック上に残るように構成されてB
  • Aに切り替えたときfinishを呼び出しますあなたはBに切り替えて、再度押すと

スタックその後、AFAあなたは、彼らがBに切り替える前にしたまったく同じ状態でそれらを得ることを意味し、バックスタックからポップされます。この場合、何もする必要はありません。HashMapは有効で、正しい内容を保持しています。

しかし、システムがメモリを必要とする場合、 "バックスタック" ActivityFragmentのインスタンスを破棄することがあります。その場合、破棄の前にonSaveInstanceStateが呼び出されます。今戻ると、AFAが再作成され、保存された状態を含むsavedInstanceStateのパラメータが返されます。ただあなたが望むものを復元するためにそれを使用してください。

実際には、onCreateViewに1行を除いて、私はあなたのコードは大丈夫だと思う(Markerクラスが正しく実装されている場合):

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

FA場合は、単にバックスタックからポップされ(とない再作成)この行により、現在の状態はHashMapになります。この行をonCreateに入れるか、宣言時にこのマップを初期化することをお勧めします。

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

@Vasilily宣言自体にHashMapを初期化しましたが、うまく動作し、コードの誤りがあり、フラグメントのhashmap onStop()がクリアされました。 – Bhushan

+0

@Bhushan、それはあなたを助けてうれしいです。これで問題が完全に解決された場合は、回答に同意してください – Vasiliy

関連する問題