【问题标题】:Android cannot find symbol method getMap() [duplicate]Android找不到符号方法getMap()[重复]
【发布时间】:2016-07-17 03:19:45
【问题描述】:

我有一个可以在我的手机上正常运行的 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 变量时,我仍然会收到空指针异常。我在 onCreated() 中定义了 getMapAsync(this),然后尝试在 onResume() 中访问 'googleMap' 对象并获取空指针异常。有没有办法来解决这个问题?谢谢。

【问题讨论】:

  • 你能显示布局文件吗?
  • Async 方法的全部目的是在异步操作准备好时运行您的代码。因此,在调用该回调之前,您不能也不应该运行任何代码。您需要重构您的登录以执行发布该回调。

标签: java android google-maps supportmapfragment


【解决方案1】:

你得到空指针异常,因为你试图使用谷歌地图对象,但谷歌地图对象仍然是空的,所以你需要按照这个步骤。 将这段代码写在 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 对象时,我仍然收到空指针异常。
  • 您在 onResume() 中收到空指针异常,因为您的地图尚未准备好。
【解决方案2】:

正如我在this 答案中所建议的那样。

getMap() 已弃用,请使用getMapAsync() 代替它,如下所示。

替换这个

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

有了这个

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

更多详情请访问link

【讨论】:

  • getMapAsync(new OnMapReadyCallBack(){})的返回类型为void。
【解决方案3】:

您可以使用getMapAsync(this) 方法。 Please check this link for more

【讨论】:

    【解决方案4】:

    替换

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

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

    【讨论】:

      【解决方案5】:

      当然你已经不匹配 SupportMapFragmentMapFragment 意味着如果你有类属性

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

      在你的XML 中你应该使用

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

      如果你有类似的类属性

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

      那么你就可以照常做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 2016-05-24
        • 2018-05-13
        • 2012-04-13
        • 1970-01-01
        相关资源
        最近更新 更多