Android找不到getMap()方法符号

9

我有一个在手机上运行良好的GPS应用程序,但是我发现一些人在生产环境中遇到了空指针异常。

    SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

    // Getting GoogleMap object from the fragment
    googleMap = fm.getMap();

    // Enabling MyLocation Layer of Google Map
    googleMap.setMyLocationEnabled(true);

    googleMap.setPadding(0, 0, 0, 90);

我从生产环境中得到的错误信息是:

引起原因:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.setMyLocationEnabled(boolean)' on a null object reference

所以我进行了一些研究,发现getMap方法已被删除,人们建议使用getMapAsync(this);

@Override
public void onMapReady(GoogleMap googleMap) {
    this.googleMap = googleMap;    //which doesn't seem to work
}

然而,我在许多不同的方法中引用了googleMap变量,我不能把所有的代码都移到onMapReady方法中。我尝试在onMapReady方法中使用this.googleMap = googleMap,但每当我尝试引用googleMap变量时仍然会收到空指针异常。我在onCreate()方法中定义了getMapAsync(this),并在onResume()方法中尝试访问'googleMap'对象,但遇到了空指针异常。有没有办法解决这个问题?谢谢。


你能展示一下布局文件吗? - Shree Krishna
Async方法的整个目的是在操作异步完成时运行您的代码。因此,在回调被调用之前,您不能也不应该运行任何代码。您需要重构您的登录以在回调之后执行。 - Aniket Thakur
5个回答

8
你之所以会得到空指针异常,是因为你试图使用谷歌地图对象,但谷歌地图对象仍然为空,所以你需要遵循以下步骤。在onCreate()方法中编写以下代码。
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

现在你需要使用public class Demo implements OnMapReadyCallback来实现你的类,简单来说,你需要重写onMapReady(Googlemap googleMap)方法。在从onMapReady()回调后,你可以执行所有操作。

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
 // Enabling MyLocation Layer of Google Map
googleMap.setMyLocationEnabled(true);
    }

我在onCreate()中创建了上述对象,但是当我尝试在onResume()中使用googleMap对象时,仍然会出现空指针异常。 - Julia
由于您的地图尚未准备就绪,因此在onResume()中出现了空指针异常。 - Alvi

4

正如我在这个答案中建议的那样。

getMap()已经被弃用,应该使用以下方式代替:getMapAsync()

请将此代码段替换为:

googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap)).getMap();

使用此功能

googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap)).getMapAsync(this);

更多详细信息请访问此链接

4
getMapAsync(new OnMapReadyCallback() {}) 的返回类型是 void。 - AnupamChugh

2
你可以使用getMapAsync(this)方法。请参考此链接了解更多信息。

1
替换
googleMap = ((SupportMapFragment) getSupportFragmentManager()
    .findFragmentById(R.id.googleMap)).getMap();

使用

googleMap = ((SupportMapFragment) getChildFragmentManager()
    .findFragmentById(R.id.map)).getMapAsync((OnMapReadyCallback) this);

0
你一定是不小心将 SupportMapFragmentMapFragment 弄混了,如果你已经设置了 class 属性的话。
class ="com.google.android.gms.maps.MapFragment"

如果你的XML中需要使用,那么你应该这样做

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

OR

如果您有类属性,例如

class="com.google.android.gms.maps.SupportMapFragment"

那么你可以像你现在做的一样。


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