1

HashMap<String, Marker> markers; フラグメントが別のアクティビティから開かれたときに格納されているマーカーを復元する必要があります。

これは私が試したものです:

    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.
4

1 に答える 1

1

以下の場合はご注意ください:

  • Afinishに切り替えても呼び出されませんB
  • Aバックスタックに残るように構成されています
  • FAバックスタックに残るように構成されています

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

ただし、システムがメモリを必要とする場合、「バックスタック」ActivityおよびFragmentインスタンスを破棄することを決定する場合があり、その場合、onSaveInstanceState破棄の前に呼び出されます。ここで戻ると、Aが再作成され、保存された状態を含むパラメーターをFA受け取ります。savedInstanceStateそれを使用して、必要なものを復元してください。

実際には、(クラスが正しく実装されていると仮定してMarker)次の1行を除いて、あなたのコードは問題ないと思いますonCreateView

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

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

private HashMap<String, Marker> markers = new HashMap<>();
于 2016-08-17T07:50:23.550 に答える