0

我有一个带有 GoogleMap 的 FragmentActivity。它在 onLocationChanged 中正确接收用户位置,我尝试使用用户位置将地图居中:

@Override
public void onLocationChanged(Location loc)
{
  if (centerMap && mMap != null)
  {
    LatLng location = new LatLng(loc.getLatitude(), loc.getLongitude());
    CameraPosition pos = new CameraPosition.Builder().target(location).zoom(12).build();
    CameraUpdate cu = CameraUpdateFactory.newCameraPosition(pos);
    mMap.animateCamera(cu);

    // centerMap = false;
    Log.e(getClass().getSimpleName(), "lat = " + location.latitude + " long = " + location.longitude);
  }
}

这段代码实际上时不时地工作(可能只有一次),并且仅在调试会话期间我在 if 语句中放置了一个断点。我不明白出了什么问题。onLocationChanged 方法被定期调用,它记录它收到的位置,这意味着它进入了 if 条件,但地图不会从 lat=0,long=0 初始位置(非洲)移动一英寸。

有什么线索吗?

编辑:我的代码中一定有一些严重损坏:甚至标记都没有显示,这是我将它们添加到地图的方法

mMap.addMarker(new MarkerOptions()
                      .position(new LatLng(lat, lng))
                      .title("title")
                      .draggable(false)
                      .visible(true));

并且“我的位置”图标也没有出现,即使我打电话

mMap.setMyLocationEnabled(true);

在 onCreate() 中。为了排除火星人等,我已经将 Eclipse、ADT 和所有其他软件更新到了最新的可用版本。

4

1 回答 1

0

出于某种原因(我不知道),将地图初始化从 onCreate() 移动到 onLocationChange() 的第一次调用就可以了。现在我的 onCreate() 很简单

@Override
protected void onCreate(Bundle savedInstanceState)
{
  super.onCreate(savedInstanceState);

  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
      WindowManager.LayoutParams.FLAG_FULLSCREEN);

  setContentView(R.layout.map_activity);

}

我的 onStart() 是:

@Override
protected void onStart()
{
  super.onStart();

  // Create the LocationRequest object
  mLocationRequest = LocationRequest.create();
  // Use high accuracy
  mLocationRequest.setPriority(
        LocationRequest.PRIORITY_HIGH_ACCURACY);
  // Set the update interval to 5 seconds
  mLocationRequest.setInterval(UPDATE_INTERVAL);
  // Set the fastest update interval to 1 second
  mLocationRequest.setFastestInterval(FASTEST_INTERVAL);

   mLocationClient = new LocationClient(this, this, this);
   mLocationClient.connect();
}

@Override
public void onConnected(Bundle arg0)
{
  mLocationClient.requestLocationUpdates(mLocationRequest, this);  
}

我的 onLocationChange() 是

@Override
public void onLocationChanged(Location loc)
{
  if (mMap == null)
  {
    mapFragment = SupportMapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getSupportFragmentManager()
        .beginTransaction();
    fragmentTransaction.add(R.id.mapcontainer, mapFragment);
    fragmentTransaction.commit();

    mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

    mMap.getUiSettings().setAllGesturesEnabled(true);
    mMap.getUiSettings().setMyLocationButtonEnabled(true);
    mMap.getUiSettings().setZoomControlsEnabled(true);
    mMap.getUiSettings().setCompassEnabled(true);
    mMap.setMyLocationEnabled(false);

    LatLng location = new LatLng(loc.getLatitude(), loc.getLongitude());
    CameraPosition pos = new CameraPosition.Builder().target(location).zoom(12).build();
    CameraUpdate cu = CameraUpdateFactory.newCameraPosition(pos);
    mMap.animateCamera(cu);

    if (mLocationClient.isConnected())
      mLocationClient.removeLocationUpdates(this);
    mLocationClient.disconnect();

    Log.e(getClass().getSimpleName(), "lat = " + location.latitude + " long = " + location.longitude);
  }
}

它有效,但现在我有一个不同的问题(地图似乎忽略了触摸事件)。我将为此创建一个单独的问题。

于 2013-10-30T19:16:24.800 回答