I have implemented an activity which adds MapFragment
at run time. The MapFragment
xml has static fragment
and I'm trying to get add at run time. Also I found there are some issues in Lollipop adding the map fragment at runtime. Kindly check Issue raised and temporary solution
I have also given my codes below,
fragment_map.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment.MapsFragment">
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="appCreators.bloodfinder.activity.MapsActivity"/>
<include
android:id="@+id/layout"
layout="@layout/template_custom_spinner"/>
</FrameLayout>
MapsFragment.java
Implements onMapReadyCallback
public class MapsFragment extends SupportMapFragment implements OnMapReadyCallback
In onResume
callback
@Override
public void onResume() {
super.onResume();
((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);
}
this always return me null and I have also tried,
((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);
this also return NullPointerException
MapsActivity.java
getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer, MapsFragment.newInstance()).commit();
I add this at onCreate
method of Activity callback.
I'm not able to figure out why I'm still getting NullPointerException
!
Some times I get Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference
Help will be appreciated!
UPDATE: Still not fixed I'm getting the following error. I looked into logs but no clue why this is happening.
Unable to resume activity {MapsActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference
I finally solved this issue for myself by observing the given answers in SO. I compared my code and the code in the answers. It seems to me that there is some confusion about this API and Google's implementation is very broad. I got this exception thrown repeatedly:
Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference
I still have no idea whats wrong with some of these implementations in SO questions that are getting the same exception, but this worked for me and it might work for someone else.
These are the the things you need to check:
Make sure you have both of these (I had only the api key meta-data)
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
You have a fragment in xml like this with the class attribute being correct as below
<fragment
android:id="@+id/google_map_fragment"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
In my case the map fragment is a child, inside another fragment.
This parent fragment apparently should not be a MapFragment or a SupportMapFragment. After changing it from SupportMapFragment to Fragment the map showed perfectly fine.
public class ParentFragment extends Fragment {
I left everything else as it was before but instead of getting the map in onCreateView I got it in onViewCreated like this:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.rewards_google_map_area);
if (mapFragment != null) {
LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (locationManager != null && mapFragment.getMap() != null) {
googleMap=mapFragment.getMap();
//after this you do whatever you want with the map
}
}
}
I changed nothing else and I did not mess with the rootView or parentView. As you would see in the the answer from @Konstantin Loginov
Try it out and let me know.