android:为什么在转换后没有正确映射工作

时间:2017-01-11 19:20:37

标签: android android-fragments google-maps-android-api-2

我的活动可以显示地点的地图视图。我通过将片段(包含地图)滑动到活动中的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”只实例化一次。

我不明白片段或地图的状态。为什么我不能在第一次转换后对地图进行编程控制(或者更准确地说,在初始地图加载后)?

0 个答案:

没有答案