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.