如何在片段内保留地图视图?

Upv*_*ote 6 android android-fragments android-mapview

我有一个用例,其中列表和地图视图共享完全相同的代码库并显示相同的数据.所以我不能通过使用ListFragment和MapFragment作为父级来分离它们.

所以我创建了一个包含两个视图的片段:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible"/>

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

用户可以在列表和地图视图之间切换.尽管地图视图无法在配置更改中保留其标记,但此操作非常有效.旋转屏幕时,地图视图将获得其没有标记且没有缩放的初始状态.之前添加的所有标记都消失了.当我使用MapFragment时,我没有遇到这个问题,它有点保留了自己.

剥离代码:

public class ListAndMapFragment extends Fragment {

    private MapView mapView;

    public ListAndMapFragment() {}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle arguments) {
        super.onCreateView(inflater, container, arguments);
        View root = inflater.inflate(R.layout.fragment_pillar_list, container, false);
        mapView = (MapView) root.findViewById(R.id.mapView);

        if (arguments == null) {
            mapView.onCreate(null);
            MapsInitializer.initialize(this.getActivity());
        }

        return root;
    }

    private GoogleMap getMap() {
        return mapView.getMap();
    }

    @Override
    public void onResume() {
        mapView.onResume();
        super.onResume();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这个问题?一种解决方案是替换所有标记.但是我想知道是否有另一种方法.

nem*_*035 3

Marker对象无法通过配置更改来保留,因为它没有实现ParcelableSerializable接口。

但是,您可以保留MarkerOptions对象,因为它是Parcelable,然后Marker从中重新创建您的 s。MarkerOptions您可以为每个s指定一个类型的类字段Marker,然后在配置更改时重新填充映射(例如在 中onSaveInstanceState):

mapView.getMap().addMarker(MyMarkerOptions);
Run Code Online (Sandbox Code Playgroud)

另一种方法是将您的Markers 保存在 HashMap 中,并在配置更改时重新使用它们。

Here is another full example即用Parcelable LatLng积分来坚持Markers

该示例有效,因此在添加标记时,它还会将相应的坐标添加到 asArrayList对象LatLng。然后,在配置更改时,ArrayList将其保存到Bundle中的对象中onSaveInstanceState,并LatLng在 中检索对象onCreate


OP的注释:

onSaveInstanceState所以我选择了实现并删除的解决方案setRetainInstance(true)。好处是我可以自己保留地图。但缺点是每次配置更改时都必须完全初始化地图,这会使应用程序在屏幕旋转等情况下变慢 1 或 2 秒。但我对此很满意。