3

Я пытаюсь отобразить MapBox во фрагменте, но я получаю следующее сообщение об ошибке:MapBox не работает в фрагменте

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.mapbox.mapboxsdk.maps.MapView.onResume()' on a null object reference

Вот класс фрагмент карты:

public class Map extends android.support.v4.app.Fragment { 
    private MapView mapView; 

public Map() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View layout = inflater.inflate(R.layout.fragment_map, container, false); 

    MapView mapView = (MapView) layout.findViewById(R.id.mapview); 
    mapView.onCreate(savedInstanceState); 
    mapView.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(MapboxMap mapboxMap) { 

      // Set map style 
      mapboxMap.setStyleUrl(Style.MAPBOX_STREETS); 

      // Set the camera's starting position 
      CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target(new LatLng(41.885, -87.679)) // set the camera's center position 
        .zoom(12) // set the camera's zoom level 
        .tilt(20) // set the camera's tilt 
        .build(); 

      // Move the camera to that position 
      mapboxMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

     } 


    }); 
    return layout; 
} 

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

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

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    mapView.onSaveInstanceState(outState); 
} 

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

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

Am Я что-то пропустил? Я проголосовал за эту ссылку: https://www.mapbox.com/help/first-steps-android-sdk/

+0

См эту ссылку http://stackoverflow.com/questions/32601219/trying- to-put-a-map-in-a-fragment-activity/32601861 # 32601861 – Emil

+0

Я использую Mapbox, все равно будет так же? @Boss –

+0

Nahh .. Я нашел вашу проблему – Emil

ответ

4

У вас есть два экземпляра карты. одна из них - локальная переменная внутри метода oncreate, а другая - глобальная переменная.

И глобальная переменная не initalized, поэтому измените эту строку

MapView mapView = (MapView) layout.findViewById(R.id.mapview); 

в этом

mapView = (MapView) layout.findViewById(R.id.mapview); 

Я думаю, вы понимаете проблему.

-1

Пожалуйста, проверьте MAPview перед использованием в любом месте может быть равна нулю или не инициализируется во время:

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

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

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
if(mapView){ 
    mapView.onSaveInstanceState(outState); 
} 
} 

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

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

использовать также на уровне класса/глобальный ссылку на объект MAPview вместо локального/внутреннего новой декларации:

MapView mapView = (MapView) layout.findViewById(R.id.mapview); 

Заменить этот

mapView = (MapView) layout.findViewById(R.id.mapview); 
Смежные вопросы