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.
