这是我的问题。我在RootMapFragment
中有viewPager
这是一个容器,我将来会有两个不同的地图。 RootMapFragment
包含简单的FrameLayout
和FragmentTransaction
我希望将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);
}
}
答案 0 :(得分:0)
viewpager
来自文档:
设置应保留在页面两侧的页数 处于空闲状态的视图层次结构中的当前页面。页面超出此范围 在需要时,将从适配器重新创建限制。
代码:
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
在您的情况下,您需要指定2,这样当您在第三页时,第一页不会被销毁,反之亦然。