@demon123
developer

Map fragment null pointer exception?

У меня два таба, в одном табе google map V2. Когда я начинаю запускать ругается на это, что здесь null
mMap = mapFragment.getMap(); Например я не могу использовать mMap во внутреннем классе, постоянно ругается на null.

Получается, что я могу только использовать mMap в методе onMapReady(). Что нужно сделать, чтобы можно было пользоваться им во всем классе и даже в других?

public class MapFragmentOne extends Fragment implements OnMapReadyCallback,
GoogleMap.OnMapClickListener{
 private static final int LAYOUT = R.layout.tab_one;
 private static View view;
 private static GoogleMap mMap;
 private SupportMapFragment mapFragment;

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        LayoutInflater lf = getActivity().getLayoutInflater();
        view = lf.inflate(LAYOUT, container, false);

mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
        if (mapFragment == null) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            mapFragment = SupportMapFragment.newInstance();
            fragmentTransaction.replace(R.id.map, mapFragment).commit();
        }
        mapFragment.getMapAsync(this);
        // Вот здесь null
          mMap = mapFragment.getMap();
        Log.d("MAP1", mMap + "");
        return view;
}

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        // А вот здесь не null
        Log.d("MAP2", mMap + "");
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.setBuildingsEnabled(true);
        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        mMap.setIndoorEnabled(true);
        mMap.setOnMapClickListener(this);
    }

 @Override
    public void onMapClick(LatLng point) {
       if (mMap != null) {
             //Actions on clicks
        }
}
  • Вопрос задан
  • 448 просмотров
Решения вопроса 1
@razer89
Android-разработчик
На этом этапе карта еще не готова. Для этого и существует метод onMapReady, в нем у вас гарантированно карта не будет равна null - используйте его. Если нужен доступ из других классов (что на мой взгляд очень некрасиво), можете реализовать свой listener, который будет срабатывать в методе onMapReady(), или сразу же, если карта уже доступна.

public class MapFragmentOne extends Fragment implements OnMapReadyCallback,
        GoogleMap.OnMapClickListener {
    private static final int LAYOUT = R.layout.tab_one;
    private static View view;
    private static GoogleMap mMap;
    private SupportMapFragment mapFragment;
    private OnGetMap listener;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        LayoutInflater lf = getActivity().getLayoutInflater();
        view = lf.inflate(LAYOUT, container, false);

        mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
        if (mapFragment == null) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            mapFragment = SupportMapFragment.newInstance();
            fragmentTransaction.replace(R.id.map, mapFragment).commit();
        }
        mapFragment.getMapAsync(this);
        return view;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        // А вот здесь не null
        Log.d("MAP2", mMap + "");
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.setBuildingsEnabled(true);
        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        mMap.setIndoorEnabled(true);
        mMap.setOnMapClickListener(this);
        if (listener != null) {
            listener.onGetMap(mMap);
        }
    }

    @Override
    public void onMapClick(LatLng point) {
        if (mMap != null) {
            //Actions on clicks
        }
    }

    public void getMap(OnGetMap listener) {
        if (mMap != null) {
            listener.onGetMap(mMap);
        } else {
            this.listener = listener;
        }
    }

    public interface OnGetMap {
        void onGetMap(GoogleMap map);
    }
}


В другом классе получаем так:
mapFragmentOne.getMap(new OnGetMap() {
            @Override
            public void onGetMap(GoogleMap map) {
                // do something with map
            }
        });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы