将 getMap 替换为 getMapAsync

Posted

技术标签:

【中文标题】将 getMap 替换为 getMapAsync【英文标题】:Replace getMap with getMapAsync 【发布时间】:2015-10-01 00:55:19 【问题描述】:

我想用getMapAsync替换已弃用的getMap方法,但我没有使用MapFragment而是GoogleMap这样:

private GoogleMap googleMap;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);

    try 
        if(googleMap == null) 
            googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        googleMap.setMyLocationEnabled(true);
        googleMap.setTrafficEnabled(true);
        googleMap.setIndoorEnabled(true);
        googleMap.setBuildingsEnabled(true);
        googleMap.getUiSettings().setZoomControlsEnabled(true);

如果我像这样将googleMap 替换为MapFragment,我将无法再使用setMapType 等等。那么在我的情况下如何更改为getMapAsync

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

【问题讨论】:

【参考方案1】:

在官方文档中,获取地图异步需要回调; 它就是你的谷歌地图的“主要入口点”!

public class MapPane extends Activity implements OnMapReadyCallback 

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

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

    @Override
    public void onMapReady(GoogleMap map) 
        // DO WHATEVER YOU WANT WITH GOOGLEMAP
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        map.setMyLocationEnabled(true);
        map.setTrafficEnabled(true);
        map.setIndoorEnabled(true);
        map.setBuildingsEnabled(true);
        map.getUiSettings().setZoomControlsEnabled(true);
    

【讨论】:

【参考方案2】:

很简单,只要让你的Activity实现OnMapReadyCallback接口,然后在onMapReady()回调中分配你的googleMap引用即可。

然后,对googleMap 执行您想要的任何操作。

这是一个简单的例子:

public class MainActivity extends Activity implements OnMapReadyCallback 

    private GoogleMap googleMap;

    @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 map) 

        googleMap = map;

        setUpMap();

    

    public void setUpMap()

        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        googleMap.setMyLocationEnabled(true);
        googleMap.setTrafficEnabled(true);
        googleMap.setIndoorEnabled(true);
        googleMap.setBuildingsEnabled(true);
        googleMap.getUiSettings().setZoomControlsEnabled(true);
    



【讨论】:

【参考方案3】:

如果您使用 MapFragment,您仍然可以使用 stMapType 方法。在您的活动上实施 OnMapReadyCallback。 创建 MapFragment 并在该对象上调用 getAsyncMap 方法。 它会要求您执行 onMapReady(GoogleMap map) 方法,您可以在其中设置地图类型等。 希望对您有所帮助。

【讨论】:

【参考方案4】:

我发现了解 getMapAsync 使用的更好方法是在 android Studio 中创建一个新项目并使用 google maps 活动的模板而不是空活动。

您将有一个项目来研究和适应您自己的项目。

【讨论】:

以上是关于将 getMap 替换为 getMapAsync的主要内容,如果未能解决你的问题,请参考以下文章

错误 getMap();

以编程方式将 GoogleMap 添加到片段

while 循环中的 mapFrag.getMapAsync() 问题

片段中的 getMapAsync()

无法解决 Fragment 中的 getMapAsync

mapFragment.getMapAsync(this) - NullPointerException