3

I have a SupportMapFragment embedded into another fragment. I get NPE from this line (note that I cannot find the reason for it, for now it seems to occur randomly):

mMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapview)).getMap();

(getMap() is what returns null exactly)

However when I change it as explained in this answer, to:

mMap = ((SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.mapview)).getMap();

then I also get NPE.

I am working with Support Library v4:19.1.0.

The problem may be related to a recent project migration from Eclipse (without Gradle) to Android Studio.

Community
  • 1
  • 1
syntagma
  • 23,346
  • 16
  • 78
  • 134

2 Answers2

0

use this in your Activity

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

and in fragment to user SupportMapFragment.

Hardik Parmar
  • 712
  • 2
  • 13
  • 28
0

Make sure that you are in your Activity inflating its Fragment dynamically.

Note: You cannot inflate a layout into a fragment when that layout includes a . Nested fragments are only supported when added to a fragment dynamically.

For instance:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment =  fm.findFragmentById(R.id.fragment);

        if(fragment == null){

            MainActivityFragment mMainActivityFragment = new MainActivityFragment();
            fm.beginTransaction()
            .replace(R.id.fragment, mMainActivityFragment, "MainActivityFragment")
            .commit();
        }
    }
}

R.layout.activity_main

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

MainActivityFragment

 public class MainActivityFragment extends Fragment {

        private SupportMapFragment supportMapFragment;
        private GoogleMap mGoogleMap = null;

        public MainActivityFragment() {
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            FragmentManager fm = getChildFragmentManager();

            supportMapFragment = (SupportMapFragment) fm.findFragmentById(R.id.container_map);

            if (supportMapFragment == null) {

                supportMapFragment =   SupportMapFragment.newInstance();
                fm.beginTransaction().replace(R.id.container_map, supportMapFragment).commit();
            }
        }

         @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View mRoot =  inflater.inflate(R.layout.fragment_main, container, false);
            return  mRoot;
        }

        @Override
        public void onResume() {
            createMapView();
            super.onResume();
        }

        private void createMapView() {

            mGoogleMap = supportMapFragment.getMap();

            if (mGoogleMap != null) {

                mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                   @Override
                   public boolean onMarkerClick(Marker marker) {

                       return false;
                   }
               });
            }
        }
    }

R.layout.fragment_main

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
Anderson K
  • 5,445
  • 5
  • 35
  • 50