Google map, вызванная внутри фрагмента, возвращает null

я пытаюсь поместить карту внутри фрагмента. Я оклейке коды я использую

XML

           <fragment
            android:id="@+id/contactFrag_F_map"
            android:name="com.google.android.gms.maps.MapFragment"
            android:layout_width="match_parent"
            android:layout_height="200dp"/>

ниже-мое имя фрагмента объявлен

public class ContactFragment extends MapFragment 

ниже, как я инициализировал карту

private void initilizeMap() {
    if (googleMap == null) {

        if (googleMap == null) {
            googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
                    R.id.contactFrag_F_map)).getMap();
        }
        // check if map is created successfully or not
        if (googleMap == null) {
            Toast.makeText(getActivity(),
                    "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                    .show();
        }
    }
}

и этот метод был вызван на onCreateView

ошибка

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.MapFragment.getMap()' on a null object reference

пожалуйста, помогите решить этот вопрос. Вопрос ниже в часть

if (googleMap == null) {
                googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
                        R.id.contactFrag_F_map)).getMap();
            }

изменить 1

изменил xml на

<fragment
                android:id="@+id/contactFrag_F_map" 
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="200dp"/>

и

public class ContactFragment extends SupportMapFragment

и инициализации

if (googleMap == null) {
                googleMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(
                        R.id.contactFrag_F_map)).getMap();
            }

но снова ошибка

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

и это происходит в строке

if (googleMap == null) {
                    googleMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(
                            R.id.contactFrag_F_map)).getMap();
                }

почему это произошло??

правка 2

да.. getmap устарел . Поэтому я попытался

MapFragment mapFragment = (MapFragment) getChildFragmentManager().findFragmentById(R.id.contactFrag_F_map);
        mapFragment.getMapAsync(this);

и ..

public class ContactFragment extends MapFragment implements OnMapReadyCallback { 

и обратный вызов ..

@Override
    public void onMapReady(GoogleMap googleMap) {

        theGoogleMap = googleMap;

        setUpMap();
    }

и метод setUpMap

public void setUpMap(){

        theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        theGoogleMap.setMyLocationEnabled(true);
        theGoogleMap.setTrafficEnabled(true);
        theGoogleMap.setIndoorEnabled(true);
        theGoogleMap.setBuildingsEnabled(true);
        theGoogleMap.getUiSettings().setZoomControlsEnabled(true);
    }

и ошибка отображается в onresume ()

java.lang.RuntimeException: Unable to resume activity {com.purpletab.daga/com.purpletab.daga.activities.CoreActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference

и

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference

5 ответов


решение. Я ставил фрагмент карты внутри фрагмента.

так....

xml для размещения внутри фрагмента является

 <fragment
                android:id="@+id/contactFrag_F_map"
                android:name="com.google.android.gms.maps.MapFragment"
                android:layout_width="match_parent"
                android:layout_height="200dp"/>

и ..

public class ContactFragment extends Fragment implements OnMapReadyCallback {

С onCreateView()

MapFragment mapFragment = (MapFragment) getChildFragmentManager().findFragmentById(R.id.contactFrag_F_map);
        mapFragment.getMapAsync(this);

и на OnMapReadyCallback

@Override
    public void onMapReady(GoogleMap googleMap) {

        theGoogleMap = googleMap;

        setUpMap();
    }

и ниже находится setUpMap.

public void setUpMap(){

        theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        theGoogleMap.setMyLocationEnabled(true);
        theGoogleMap.setTrafficEnabled(true);
        theGoogleMap.setIndoorEnabled(true);
        theGoogleMap.setBuildingsEnabled(true);
        theGoogleMap.getUiSettings().setZoomControlsEnabled(true);
    }

работает нормально.. :)


не

googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
                    R.id.contactFrag_F_map)).getMap();

Do

googleMap = ((MapFragment) getActivity().getSupportFragmentmanager().findFragmentById(
                    R.id.contactFrag_F_map)).getMap();

getSupportFragmentManager

возвращает FragmentManager для взаимодействия с связанными фрагментами с этой деятельностью.


попробуйте использовать ниже код :

private void initilizeMap() {

    FragmentManager fm = getSupportFragmentManager();
    SupportMapFragment fragment = (SupportMapFragment) fm.findFragmentById(R.id.contactFrag_F_map);
    if (fragment == null) {
        fragment = SupportMapFragment.newInstance();
    }
    mapView = fragment.getMap();
}

в вашем Xml-файле:

       <fragment
            android:id="@+id/contactFrag_F_map" 
            class="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="200dp"
             />

в onCreateView

        mMapView.onCreate(savedInstanceState);
        mMap = mMapView.getMap();
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
        mMap.setMyLocationEnabled(false); 

в xml

 <com.google.android.gms.maps.MapView
   android:id="@+id/map"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_below="@+id/tag_text_header" />

прежде всего, вы делаете все это неправильно с самого начала-см. запросах getmap:

этот метод устарел. Вместо этого используйте getMapAsync(OnMapReadyCallback). Метод обратного вызова предоставляет экземпляр GoogleMap, который гарантированно не имеет значения null и готов к использованию.

во-вторых-кажется (однако я не уверен), вы не знакомы с вложенностью фрагментов, прочитайте это NestedFragments.