替换viewPager中的MapFragment

时间:2017-04-16 19:18:44

标签: java android google-maps

这是我的问题。我在RootMapFragment中有viewPager这是一个容器,我将来会有两个不同的地图。 RootMapFragment包含简单的FrameLayoutFragmentTransaction我希望将frame_layout替换为onCreateView中的marker_map。在第一次创建marker_map时,一切正常,地图中填充了从eventBus获得的标记。在viewPager时,我有3个标签。地图位于第一个标签中。当我进入第二个选项卡并返回第一个选项卡时,我的应用程序会记住带有标记的地图的早期状态,但是当我转到第三个选项卡并返回到第一个选项卡时,应用程序正在创建新的地图实例并且它是空的。是否有解决方案,我的应用程序将记住第一个状态而不是创建新的地图实例?

RootMapFragment.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_map_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.lwach.earthquakeapp.map.RootMapFragment">

</FrameLayout>

RootMapFragment.java

public class RootMapFragment extends Fragment {

    private SupportMapFragment map;
    private FragmentManager fm;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_root_map, container, false);

        fm = getChildFragmentManager();

        map = (SupportMapFragment) fm.findFragmentById(R.id.marker_map);

        if (map == null) {
            map = SupportMapFragment.newInstance();
            fm.beginTransaction().replace(R.id.root_map_fragment, new MarkerMapFragment()).commit();
        }

        return view;
    }
}

MarkerMapFragment.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/marker_map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.lwach.earthquakeapp.map.MarkerMapFragment" />

MarkerFragment.java

public class MarkerMapFragment extends SupportMapFragment implements OnMapReadyCallback {

    private GoogleMap mMap;
    private Bus bus = BusProvider.getInstance();

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.getUiSettings().setMapToolbarEnabled(true);
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    }

    @Subscribe
    public void onServerEvent(ServerEvent serverEvent) {

        List<Feature> features = serverEvent.getDataResponse().getFeatures();

        ClusterManager<MarkerItem> clusterManager = new ClusterManager<>(getContext(), mMap);
        clusterManager.setRenderer(new ClusterRenderer(getContext(), mMap, clusterManager));
        mMap.setOnCameraIdleListener(clusterManager);

        for (int i = 0; i < features.size(); i++) {
            MarkerItem markerItem = new MarkerItem(features, i);
            clusterManager.addItem(markerItem);
        }
    }

    @Subscribe
    public void onErrorEvent(ErrorEvent errorEvent) {
        Toast.makeText(getActivity(), "" + errorEvent.getErrorMsg(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onResume() {
        super.onResume();
        bus.register(this);

        if (mMap == null) {
            getMapAsync(this);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        bus.unregister(this);
    }
}

1 个答案:

答案 0 :(得分:0)

尝试使用setOffscreenPageLimit

viewpager

的方法

来自文档:

  

设置应保留在页面两侧的页数   处于空闲状态的视图层次结构中的当前页面。页面超出此范围   在需要时,将从适配器重新创建限制。

代码:

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

在您的情况下,您需要指定2,这样当您在第三页时,第一页不会被销毁,反之亦然。