2017-01-20 1 views
3

Я пытаюсь создать MapView программно и добавить MarkerPosition, как показано ниже:Программным Создание MapView и добавление маркера Результаты в исключения нулевого указателя в фрагменте

MapView mapView = new MapView(getActivity()); 
((ViewGroup) rootView).addView(mapView); 

GoogleMap googleMap = mapView.getMap(); 
googleMap.addMarker(new MarkerOptions() 
     .position(new LatLng(
       Double.parseDouble(
         mEvent.getEventInfo().mEventData.mLat), 
       Double.parseDouble(
         mEvent.getEventInfo().mEventData.mLng))) 
     .title("Marker")); 

манифеста Файл:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

<permission 
    android:name="com.example.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="com.example.permission.MAPS_RECEIVE" /> 

Я получаю следующее сообщение об ошибке:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference 

ответ

3

, потому что ваш Googlemap еще не загружен означает нуль, и вы добавляете маркер на него, который является причиной аварии. лучше использовать mapView.getMapAsync(context);, а не mapView.getMap(); и реализовать этот метод

@Override 
    public void onMapReady(final GoogleMap map) { 
     if(map != null){ 
     // you are ready to add marker here   
     } 
    } 
2

карта Google должна теперь быть загружена асинхр, путем добавления MapFragment на ваш взгляд, а затем работать над ней. Нечто подобное будет работать:

public class MainActivity extends Activity implements OnMapReadyCallback { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map_activity); 


     MapView mapView = new MapView(this); 
     ((LinearLayout) findViewById(R.id.mapWrapper)).addView(mapView); 
     mapView.getMapAsync(this); 

    } 

    @Override 
    public void onMapReady(GoogleMap map) { 

     map.addMarker(new MarkerOptions() 
       .position(new LatLng(0, 0)) 
       .title("Marker")); 
    } 

} 

При такой схеме

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

</LinearLayout> 
0

Оказывается, что сервисы Google Play версии 11.8.0onCreatea() и onResume() являются обязательными, чтобы увидеть MapView:

@Override public void setupMap(LatLng latLng) { 
    if (mapView == null) { 
     mapView = new MapView(getActivity()); 
     rootLayout.addView(mapView); 
     mapView.onCreate(Bundle.EMPTY); 
    } 
    mapView.getMapAsync(map -> { 
     map.clear(); 
     map.addCircle(MapUtil.makeDefaultGreenCircle(getActivity(), latLng)); 
    }); 
    } 

@Override public void onResume() { 
    super.onResume(); 
    mapView.onResume(); 
    } 
Смежные вопросы