2016-02-07 2 views
0

Я пытаюсь реализовать OnMapLongClickListener для моего приложения карты, чтобы каждый раз, когда пользователь долго щелкает по экрану, маркер появляется в соответствующем месте.Почему onMapLongClick бросает исключение RuntimeException?

Мой класс MainActivity выглядит следующим образом:

import android.graphics.Color; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.widget.Toast; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CircleOptions; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener { 

    private GoogleMap mMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
     mMap.setOnMapLongClickListener(this); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     // Add a marker in Hatfield and move the camera 
     LatLng hatfield = new LatLng(51.7471060, -0.22978); 
     mMap.addMarker(new MarkerOptions() 
       .position(hatfield) 
       .title("Hertfordshire Times") 
       .snippet("Hertfordshire Lecturer wins Nobel Prize") 
       .draggable(true)); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(hatfield)); 

     mMap.addCircle(new CircleOptions() 
       .center(hatfield) 
       .fillColor(0x5500ff00) 
       .strokeColor(Color.WHITE).radius(60)); 
    } 

    @Override 
    public void onMapLongClick(final LatLng latLng) { 
     if(mMap != null) { 
      Toast.makeText(this, "Long press", Toast.LENGTH_LONG).show(); 
      mMap.addMarker(new MarkerOptions() 
      .position(latLng) 
      .title("You placed a marker here") 
      .icon(BitmapDescriptorFactory.defaultMarker())); 
     } 
    } 
} 

После того, как OnMapLongClick пробегов метод, он бросает NullPointerException (фрагмент ошибки приведен ниже):

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void  com.google.android.gms.maps.GoogleMap.setOnMapLongClickListener(com.google.android.gms.maps.GoogleMap$OnMapLongClickListener)' on a null object reference 
                          at com.example.paulmbw.map_application_fyp.MapsActivity.onCreate(MapsActivity.java:29) 

Любая идея, что я «Неправильно? Я видел похожие ответы на Stack, но не могу найти решение для своей проблемы. Любая помощь будет оценена.

Спасибо.

+0

Поскольку 'mMap' есть ** NULL ** – Rami

+0

Переместите 'mMap.setOnMapLongClickListener (this);' в метод 'onMapReady()'. –

+1

Возможный дубликат [Что такое Исключение Null Указатель и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do -i-fix-it) –

ответ

0

Позвонить mMap.setOnMapLongClickListener(this); внутри onMapReady().

mMap is null, когда вы вызываете это на нем, потому что утверждение прямо перед ним является асинхронным. Он не дожидается вашего обратного вызова onMapReady(), чтобы получить полное или что-то в этом роде. Он называет его, когда он готов.

0

Потому что mMap является null (еще не готово).

Переместить слушателя в onMapReady() метод.

@Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     // Add a marker in Hatfield and move the camera 
     LatLng hatfield = new LatLng(51.7471060, -0.22978); 
     mMap.addMarker(new MarkerOptions() 
       .position(hatfield) 
       .title("Hertfordshire Times") 
       .snippet("Hertfordshire Lecturer wins Nobel Prize") 
       .draggable(true)); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(hatfield)); 

     mMap.addCircle(new CircleOptions() 
       .center(hatfield) 
       .fillColor(0x5500ff00) 
       .strokeColor(Color.WHITE).radius(60)); 

     mMap.setOnMapLongClickListener(MapsActivity.this); 
    } 
+1

благодарим вас за ответ. он работал :) – archon101

0

Выступит на карте Нажмите

private GoogleMap map; 
private Marker marker; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
ActionBarActivity activity = (ActionBarActivity) getActivity(); 
activity.getSupportActionBar().setTitle(R.string.select_location); 
super.onCreateView(inflater, container, savedInstanceState); 
return inflater.inflate(R.layout.map, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
super.onViewCreated(view, savedInstanceState); 
    Log.d("Map","On view created"); 
map = getMap(); 
     map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
map.setOnMapClickListener(new OnMapClickListener() { 

    @Override 
    public void onMapClick(LatLng point) { 
     Log.d("Map","Map clicked"); 
     marker.remove(); 
     drawMarker(point); 
    } 
}); 

Вы можете увидеть более подробно для Google Map и Location Manager, визит: http://www.studygtu.com/2016/02/google-map-implement-and-location.html

+0

Это ** плохой ** идея и может не решить проблему - 1) * getMap() * не гарантирует возврат непустого объекта. - 2) * getMap() * устарел. – Rami

Смежные вопросы