我的活动可以显示地点的地图视图。我通过将片段(包含地图)滑动到活动中的FragmentLayout容器来切换地图视图。当它有内容时,此布局包含列表布局。动画正确切换/切出地图视图。
地图第一次转换时,地图相机会聚焦在当前位置,而onMapClick()会按预期工作。
当地图过渡时,摄像机会在北/南大西洋和非洲的视野中一直变焦。并且onMapClick()事件不会触发。我已经尝试更改地图的UiSettings,看看我是否对后续转换有任何编程控制,但这不起作用。
以下是我在活动中转换地图的方式(视觉上可以正常工作)
void toggleMapView() {
log("toggleMapView()");
if (!isMapShowing) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.addToBackStack(null);
// fades in, then fades out on back key
transaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_in_left,
android.R.anim.slide_out_right, android.R.anim.slide_out_right);
// mapFragment is assigned in onCreated()
transaction.replace(R.id.framelayout_fragment_container, mapfragment, "MAPTAG");
transaction.commit();
} else
this.onBackPressed();
isMapShowing = !isMapShowing;
}
这是片段中的onMapReady():
@Override
public void onMapReady(GoogleMap googleMap) {
log("onMapReady()");
mMap = googleMap;
LatLng currentLatLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
//marker = mMap.addMarker(new MarkerOptions().position(currentLatLng).title("").draggable(true).visible(false));
mMap.setMinZoomPreference(4.0f);
mMap.setMaxZoomPreference(20.0f);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15.0f));
UiSettings ui = mMap.getUiSettings();
ui.setCompassEnabled(false);
ui.setRotateGesturesEnabled(false);
ui.setTiltGesturesEnabled(false);
ui.setZoomControlsEnabled(false);
mMap.setOnMapClickListener(this);
}
我记录了所有方法,以便查看调用顺序。以下是每次地图转换时的样子:
D/ << GET_PLACE >>: onCallbackFromFragment()
D/ << MAP_P_Frag >>: setCurrentLocation()
D/ << GET_PLACE >>: toggleMapView()
D/ << MAP_P_Frag >>: onAttach()
D/ << MAP_P_Frag >>: onCreate()
D/ << MAP_P_Frag >>: onCreateView()
D/ << MAP_P_Frag >>: onstart()
D/ << MAP_P_Frag >>: onResume() [only calls setCamera]
D/ << MAP_P_Frag >>: setCamera() [calls onMapReady]
D/ << MAP_P_Frag >>: onMapReady()
地图在onCreateView()中加载一次,这应该在第一次转换期间调用onMapReady()。
if (mapFragment == null) {
mapFragment = SupportMapFragment.newInstance();
mapFragment.getMapAsync(this);
}
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.replace(R.id.map_container, mapFragment).commit();
因为onResume()无条件地调用 - &gt; setCamera()依次调用 - &gt; onMapReady(),我希望在第一次转换时看到onMapReady()方法被调用两次......但我没有。
我修改了我的setCamera()方法来改变地图的UiSettings,而不是调用onMapReady()。
编辑后,onMapReady()仅在第一次转换期间被调用一次,如预期的那样。但是,在后续转换期间尝试更改UiSettings没有任何效果。我设置了一个断点来确保调用UiSettings。我没有错误,也没有任何效果。
public void setCamera() {
log("setCamera()");
if (mMap != null) {
UiSettings ui = mMap.getUiSettings();
ui.setCompassEnabled(true);
ui.setRotateGesturesEnabled(true);
ui.setTiltGesturesEnabled(true);
ui.setZoomControlsEnabled(true);
}
}
最后,我消除了toggleMapView()中的转换,并做了一个简单的片段replace(),但它也没有效果。我还确保关键的全局变量“mMap”和“mapFragment”只实例化一次。
我不明白片段或地图的状态。为什么我不能在第一次转换后对地图进行编程控制(或者更准确地说,在初始地图加载后)?