gpt4 book ai didi

android - HashMap 将 onSaveInstanceState 从 Fragment 存储和恢复到另一个 Activity

转载 作者:行者123 更新时间:2023-11-30 01:05:01 25 4
gpt4 key购买 nike

需要恢复存储在 HashMap<String, Marker> markers; 中的标记当从另一个 Activity 中打开 fragment 时。

这是我尝试过的:

    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);
}

当 fragment 从另一个 Activity 的暂停状态恢复时,我想恢复 fragment 上的标记。例如:Activity A 包含 Fragment FA,在前台调用 Activity B,然后再次按下 Fragment 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.

最佳答案

请注意,如果:

    当您切换到 B 时,
  • A 不会调用 finish
  • A 被配置为保留在返回堆栈上
  • FA 被配置为保留在 back-stack 上

然后当你切换到B然后按回车时,AFA会从back-stack中弹出,这意味着你让它们处于与切换到 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<>();

关于android - HashMap 将 onSaveInstanceState 从 Fragment 存储和恢复到另一个 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38940647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com