如何在Android的onMapReady()外添加Google地图标记?

5
我有以下函数,可以返回设备的当前位置:
void getCurrentLocation()
{
    Location myLocation  = map.getMyLocation();
    if(myLocation!=null)
    {
        double dLatitude = myLocation.getLatitude();
        double dLongitude = myLocation.getLongitude();
        map.addMarker(new MarkerOptions().position(new LatLng(dLatitude, dLongitude))
                .title("My Location").icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_RED)));
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8));

    }
    else
    {
        Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show();
    }
}

但是一些方法显示为红色,就像它们未定义一样: this 正如您所注意到的那样,这些方法与 map 有关,在 onMapReady() 函数中使用时可以正常工作,但在外部却不被识别。为什么会这样?我需要添加哪些库?我是这样声明 map 的:
private MapFragment map;
2个回答

6

以下是您一般的代码结构,重要的部分是将您本地的map引用分配给在onMapReady()回调中返回的那个。

public class MainActivity extends Activity 
        implements OnMapReadyCallback {

    private GoogleMap map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);

        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap retMap) {

        map = retMap;

        setUpMap();

    }

    public void setUpMap(){

        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        map.setMyLocationEnabled(true);
    }

    void getCurrentLocation()
    {
        Location myLocation  = map.getMyLocation();
        if(myLocation!=null)
        {
            double dLatitude = myLocation.getLatitude();
            double dLongitude = myLocation.getLongitude();
            map.addMarker(new MarkerOptions().position(new LatLng(dLatitude, dLongitude))
                    .title("My Location").icon(BitmapDescriptorFactory
                            .defaultMarker(BitmapDescriptorFactory.HUE_RED)));
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8));

        }
        else
        {
            Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show();
        }
    }

}

我可以把 getCurrentLocation() 放在哪里? - Muhammad Shahzad
@MuhammadShahzad 这种获取位置信息的方式已经过时了,如果您想在地图上获取当前位置,请参考这里:https://dev59.com/Zl0a5IYBdhLWcg3wfY06 - Daniel Nugent
谢谢,我无法在Android Studio中获取当前位置,模拟器5554,我尝试了geo fix xxx xxxx和其他所有可能的方法,但都失败了。 - Muhammad Shahzad
@MuhammadShahzad,听起来你看过这个:https://dev59.com/tXE95IYBdhLWcg3whOLK 我建议使用真实设备测试基于位置的代码..... - Daniel Nugent

1
你为什么使用


 private MapFragment map;

你的地图应该是以下类型:

com.google.android.gms.maps.GoogleMap

只需更改

标签的结束标记


private MapFragment map;

to

private GoogleMap map;

并获取像下面这样的地图:
map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();

它将正常工作。


声明Google地图的方法是什么?我之前使用的是 map = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 来进行赋值,但是我切换到Google地图后出错了,因为类型不同。 - Rene Limon
@ReneLimon 更新了答案。请检查最后一行。 - Karthik
最后一个问题,getMap 方法没有被弃用吗? - Rene Limon
@ReneLimon 对不起,它已经被弃用了。请使用 getMapAsync()onMapReady() 返回地图对象,保证不为空。 - Karthik
@karthik 实际上,它不能是 onMapAsync,因为它们是不同的类型,我正在遵循 Daniel Nugent 的步骤。 - Rene Limon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接