【问题标题】:onMapReady not being called: Google Map in FrgmentActivity: Android StudioonMapReady 未被调用:FrgmentActivity 中的谷歌地图:Android Studio
【发布时间】:2017-04-07 14:48:10
【问题描述】:

我有一个 FragmentActivity,我正在尝试加载谷歌地图。它实现了 OnMapReadyCallBack,当我尝试给地图充气时,我得到了 mapFragment 对象,但是在调用 getMapAsync 后应用程序崩溃了。以下是我的代码:

public class MapActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap googleMap;

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

    setContentView(R.layout.activity_map);

    initializeMap();
    }

    private void initializeMap() {
        if (googleMap == null) {
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
            if(mapFragment!=null){
                mapFragment.getMapAsync(MapActivity.this);
            }

            // check if map is created successfully or not
            if (null== googleMap) {
                Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onMapReady(GoogleMap map) {
        googleMap = map;
        googleMap.setMyLocationEnabled(true);
    }
}

我尝试调试,我注意到我正在获取 mapFragment 对象,但它从未到达 onMapReady 方法,这使我的 googleMap 对象为空,并且当任何与 googleMap 相关的方法(例如 setOnCameraChangeListener)被调用时应用程序崩溃。我已经通过了documentation page,但它似乎在我的项目中不起作用。

我的项目中可能缺少什么吗?我应该如何克服这个错误并阻止应用程序崩溃。

TIA

编辑 1:

以下是我在 xml 文件中的地图片段

<fragment
  android:id="@+id/map"
  class="com.google.android.gms.maps.SupportMapFragment"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MapsActivity"
  android:name="com.google.android.gms.maps.SupportMapFragment"/>

【问题讨论】:

  • 你能展示你的 R.layout.activity_map 吗?
  • 检查我在问题中的编辑。

标签: android google-maps android-studio nullpointerexception supportmapfragment


【解决方案1】:

提示是getMapAsync(asynchronous)

onMapReady 不会被立即调用,这意味着googleMap 在方法被调用之前不会被设置。

编辑:确保在设置映射值之前没有对googleMap 进行方法调用,即在对其运行方法之前添加一个检查是否为空。还将@Nullable 注释添加到private GoogleMap googleMap; 中,这将有助于开发,因为如果您缺少空检查,Android Studio 会提醒您。

【讨论】:

  • 那么,我应该如何重新排列我的代码以使其工作。因为我已经在 onMapReady 中启动了 googleMap 对象。
  • 确保在设置之前没有使用googleMap,记住当googleMap 不为空时没有任何保证
  • 谢谢瑞恩。在 googleMap 上检查 null 帮助我纠正了错误。请检查我的回答,了解我是如何消除错误的。
【解决方案2】:

mapFragment.getMapAsync(MapActivity.this); 表示地图将被异步加载,如果加载完成,将回调onMapReady()

以下代码可能无法运行,因为地图尚未完成加载。您应该在 onMapReady() 方法内设置地图,而不是在 initializeMap() 内。

if (null == googleMap) { // googleMap will still be null here
    Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show();
}

【讨论】:

  • 那么,我应该如何重新排列我的代码以使其工作。因为我已经在 onMapReady 中启动了 googleMap 对象,而不是在那之前。
【解决方案3】:

嗯。我得到了解决方案。我将与 googleMap 相关的方法(即 setOnCameraChangeListener)移动到了 onMapReady,该方法之前在 onCreate 中被调用。 onCreate 中的 googleMap 对象为空,导致应用程序崩溃。

【讨论】:

  • 这样一个丑陋的黑客!
  • 是的。我为此苦苦挣扎了两天,这个简单的 hack 解决了它
【解决方案4】:

@qwertz 你必须在你的 oncreate 中设置地图。当 getMapAsync 完成后,mapreadycallback 将调用 onMapReady

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

这对我有用

【讨论】:

  • 问题表明 Aashish 已经拥有与您相同的代码。
  • RTQ(阅读问题),然后再提供答案。 OP已明确表示他已经实现了您帖子中提供的代码。这篇文章对讨论没有任何价值。
猜你喜欢
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多