Stu*_*ent 17 android android-mapview google-maps-android-api-2
MapView的getMap()方法可以返回null.我知道这是Google的预期行为.
有人可以提供关于何时以及在何种情况下该方法返回null 的明确描述getMap()?
我知道如果Google服务在给定设备上不可用,getMap()则会返回null.这种可能性相对较好地记录在案.我更关注模糊的其他情况,即使在设备上安装Google服务,getMap()仍然可以返回null.
到目前为止,我的假设是底层地图系统有一些初始化,在此期间您的代码可能会执行并获得一个空地图.
我的假设是否正确?
在Activity或Fragment生命周期中是否有任何特定的位置我们可以明确地获得非null GoogleMap(如果我们假设安装了Google Services IS)?
我提出这个问题的目的是防止if(mapView.getMap() != null)在我的代码中散布一连串的支票.此外,这个问题似乎依然拿出定期在这里StackOverflow上,我想看看我们是否能够割肉出局的背后究竟是怎么回事用真情MapView和getMap()
dan*_*117 13
Google处理的场景 如果未安装google play apk,则会获得null.但它以某种方式内置于从Playstore下载它.但是可能没有安装Playstore,因此您获得了一个空映射.如果互联网不可用且安装了Play商店,但谷歌播放服务不是你的,因为无法安装谷歌播放服务.但是为你完成了这些senarios的编码.
您的代码处理的场景.
这是你必须编写的代码.如果您偏离地图样本中列出的模式,您将获得一个空地图.每个样本都以同样的方式完成.如果onCreate中的第一次调用失败,那么仍然有第二次机会在onResume中获取地图.您的解决方案是getMap()只在一个地方调用并保存返回的地图对象.遵循地图样本使用的基本模式.在onCreate和onResume方法中setupmapifneeded,setupmap当map对象不为null时,调用哪些inturn调用.
这是第一张地图样本.
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gosylvester.testapp;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
/**
* This shows how to create a simple activity with a map and a marker on the map.
* <p>
* Notice how we deal with the possibility that the Google Play services APK is not
* installed/enabled/updated on a user's device.
*/
public class BasicMapActivity extends FragmentActivity {
/**
* Note that this may be null if the Google Play services APK is not available.
*/
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.basic_demo);
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
/**
* Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
* installed) and the map has not already been instantiated.. This will ensure that we only ever
* call {@link #setUpMap()} once when {@link #mMap} is not null.
* <p>
* If it isn't installed {@link SupportMapFragment} (and
* {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
* install/update the Google Play services APK on their device.
* <p>
* A user can return to this FragmentActivity after following the prompt and correctly
* installing/updating/enabling the Google Play services. Since the FragmentActivity may not have been
* completely destroyed during this process (it is likely that it would only be stopped or
* paused), {@link #onCreate(Bundle)} may not be called again so we should call this method in
* {@link #onResume()} to guarantee that it will be called.
*/
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
/**
* This is where we can add markers or lines, add listeners or move the camera. In this case, we
* just add a marker near Africa.
* <p>
* This should only be called once and when we are sure that {@link #mMap} is not null.
*/
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
}
}
Run Code Online (Sandbox Code Playgroud)
谷歌有一种更方便的方法来使用以下方法获取地图,因为它可能依赖于从设备到设备来准备地图!使用以下方法在映射准备就绪时获取映射.
myMapFragment.getMapAsync(new OnMapReadyCallback) {
@Override
public void onMapReady(GoogleMap googleMap) {
myMap = googleMap;
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13388 次 |
| 最近记录: |