2013-02-18 6 views
0

Я пытаюсь отобразить простую карту в приложении для Android, используя класс MapView. Я использую следующий метод onCreate в моей деятельности:Android Карты Google: инициализация карты

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     MapsInitializer.initialize(this); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     Log.e("Address Map", "Could not initialize google play", e); 
    } 

    MapView mapView = new MapView(this); 
    CameraUpdate camPos = CameraUpdateFactory.newLatLng(new LatLng(11.562276,104.920292)); 
    mapView.getMap().moveCamera(camPos); 
    setContentView(mapView); 
} 

У меня есть NullPointerException, так как метод mapView.getMap() возвращает null. Не понимаю, почему сервисы Google Play, по-видимому, присутствуют и инициализируются.

+0

Посмотрите на этот учебник по протоколу HTTPS: //developers.google.com/maps/documentation/android/v1/hello-mapview – Vivek

ответ

4

Не удалось получить MapView работать, я, наконец, закончился, используя класс SupportMapFragment.

Для тех, кто может помочь, вот полный код моей деятельности:

public class AddressMap extends android.support.v4.app.FragmentActivity { 

    private final static int FRAGMENT_ID = 0x101; 
    private GoogleMap mMap; 

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

     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.HORIZONTAL); 
     layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

     SupportMapFragment fragment = SupportMapFragment.newInstance(); 
     layout.setId(0x101); 
     { 
      FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.add(FRAGMENT_ID, fragment); 
      fragmentTransaction.commit(); 
     } 

     setContentView(layout); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setUpMapIfNeeded(); 
    } 


    private void setUpMapIfNeeded() { 
     if (mMap == null) { 
      mMap = ((SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(FRAGMENT_ID)).getMap(); 
      if (mMap != null) { 
       mMap.moveCamera(
        CameraUpdateFactory.newLatLngZoom(new LatLng(11.562276, 104.920292), 10)); 
      } 
     } 
    } 
} 
1

Вы пытаетесь получить доступ Google Maps Android v1 Api который сейчас осуждается, пожалуйста, используйте Google Map Android Api v2

+2

Но я смотрю API API API Android API v2 и вижу класс MapView [здесь] (https: // разработчик s.google.com/maps/documentation/android/reference/com/google/android/gms/maps/MapView)? –

2

Кроме того, mapView.onCreate() должен быть вызван.

+0

Спасибо! Это то, чего я пропустил! Теперь я могу создать собственный собственный фрагмент с настраиваемым макетом, который включает MapView и его работу! Теперь я даже могу использовать его в ViewPager без ограничений использования SupportMapFragment –

0

Я использовал его, как это и это сработало, это с новым API:

compile 'com.google.android.gms:play-services-maps:10.2.6'

public class MapViewFragment extends Fragment{ 
public static final String TAG = MapViewFragment.class.getSimpleName(); 

MapView mapView; 
GoogleMap map; 

static MapViewFragment instance; 

public static MapViewFragment newInstance(){ 
    if(instance == null){ 
     instance = new MapViewFragment(); 
     return instance; 
    }else{ 
     return instance; 
    } 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    Log.i(TAG, "onCreateView: "); 

    View view = inflater.inflate(R.layout.map_view_fragment, container, false); 
    mapView = (MapView) view.findViewById(R.id.mvMap); 
    if(mapView != null){ 

     mapView.onCreate(null); //Don't forget to call onCreate after get the mapView! 


     mapView.getMapAsync(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(GoogleMap googleMap) { 
       map = googleMap; 
       //Do what you want with the map!! 
      } 
     }); 

     MapsInitializer.initialize(this.getActivity()); 
    }else{ 
     Log.i(TAG, "onCreateView: mapView is null"); 
    } 

    return view; 
} 

@Override 
public void onResume() { 
    mapView.onResume(); 
    super.onResume(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mapView.onDestroy(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
    mapView.onLowMemory(); 
    } 
} 

А вот мой макет:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<com.google.android.gms.maps.MapView 
    android:id="@+id/mvMap" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

</com.google.android.gms.maps.MapView> 

</LinearLayout> 
Смежные вопросы