0

Я получаю java.lang.NullPointerException на линии map.setOnMyLocationChangeListener(myLocationChangeListener);. Как ни странно, это исключение возникает при запуске некоторых устройств, а в некоторых - нет. Как я могу это решить?android SupportMapFragment: java.lang.NullPointerException

public class MyMap extends ActionBarActivity implements 
    RoutingListener, OnMapReadyCallback, 
    SensorEventListener { 

// private GoogleApiClient mGoogleApiClient; 
protected GoogleMap map; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my_map); 

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

    if (mapFragment == null) { 
     mapFragment = SupportMapFragment.newInstance(); 
     getSupportFragmentManager().beginTransaction().replace(R.id.map, mapFragment).commit(); 
    } 

    mapFragment.getMapAsync(this); 
    map = mapFragment.getMap(); 


    map.setOnMyLocationChangeListener(myLocationChangeListener); 
} 

EDIT:

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

    mUiSettings = map.getUiSettings(); 
    mUiSettings.setZoomControlsEnabled(true); 
    mUiSettings.setCompassEnabled(true); 

    updateMyLocation(); 


} 
+0

extends FragmentActivity First –

+0

Можете ли вы объяснить немного больше о том, почему и как это решить проблему? – anon

+2

ActionBarActivity уже расширяет FragmentActivity @IntelliJ Amiya –

ответ

1

позвонив по телефону mapFragment.getMapAsync(this);, я полагаю, вы должны переопределить этот метод public void onMapReady(GoogleMap googleMap). Установите там mMap = googleMap и установите там все остальные слушатели. Имейте в виду, что вашему объекту Map требуется некоторое время для инициализации, поэтому они дают вам метод getMapAsync.

Editted:

Пожалуйста, удалите это из вашей onCreated

map = mapFragment.getMap(); map.setOnMyLocationChangeListener(myLocationChangeListener);

и положить ихmap.setOnMyLocationChangeListener(myLocationChangeListener); внутри вашего onMapReady() после этой строки map = mMap. Пожалуйста, подтвердите, когда ваша карта инициализирована.

+0

Я уже переопределяю onMapReady. Я включил его в EDIT. – anon

+1

Ну, ** REMOVE ** this '' 'map = mapFragment.getMap(); map.setOnMyLocationChangeListener (myLocationChangeListener); '' 'от вашего onCreated. Как я уже сказал, ваша карта по-прежнему остается нулевой. –

+0

@Nguyen: Поэтому я должен установить свою карту на mapFragment.getMap(); 'или' GoogleMap mMap'? – anon

0

При работе с GoogleMap то требуется время для инициализации. Иногда в некоторых устройствах требуется больше времени, чем другие.

Чтобы решить эту проблему, вы должны инициализировать объект GoogleMap с некоторой задержкой. Вы можете следовать ниже стратегии:

private Handler handler = new Handler(); 

private Runnable mapChecker = new Runnable() { 

    @Override 
    public void run() { 
     try { 

      if (mapFragment.getMap() != null) { 

       map = mapFragment.getMap(); 
       map.setOnMyLocationChangeListener(myLocationChangeListener); 

       return; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     handler.postDelayed(mapChecker, 500); 
    } 
}; 

Тогда из onCreate(),

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my_map); 

    .......... 

    handler.postDelayed(mapChecker, 500); 

    .......... 

} 
+0

Поскольку у нового API есть метод '' getMapAsync'' и метод обратного вызова '' 'onMapReady'', вы не Мне это нужно больше. Взгляните на мой ответ. –

+0

, так как в последнее время я не с «GoogleMap», я не знал об этом обратном вызове. Теперь я вижу это ... это хорошо. –

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