AG1
AG1

Reputation: 6774

Why is SupportMapFragment is null (support back to API 9)

I have created a Github project that demonstrates the issue.

git clone https://github.com/anujgoyal/buggymap.git

I realize there are existing questions, but very few of them have distilled the program down to this level. In addition I have a hard requirement to use the android.support.v4.app.Fragment class, not FragmentActivity, not MapFragment.

Note that you will have to change android:value for your com.google.android.maps.v2.API_KEY in AndroidManifest.xml

Why is SupportMapFragment NULL?

// MainActivity.java
package com.txt2lrn.buggymap;
import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }

    public static class PlaceholderFragment extends Fragment implements OnMapReadyCallback {

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

            //SupportMapFragment smf0 =
            //        (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

            SupportMapFragment smf1 =
                (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);

            SupportMapFragment smf2 =
                    (SupportMapFragment)
            getActivity().getSupportFragmentManager().findFragmentById(R.id.map);

            Log.d("maps", "smf1: "+smf1); // always NULL
            Log.d("maps", "smf2: "+smf2); // always NULL
            //smf.getMapAsync(this);
            return rootView;
        }

        @Override
        public void onMapReady(GoogleMap map) {
            // code will go here once getMapAsync works
        }

    }
}

Here is the fragment_main.xml

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$PlaceholderFragment">

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

</RelativeLayout>

Upvotes: 0

Views: 544

Answers (1)

CommonsWare
CommonsWare

Reputation: 1007349

You appear to be trying to use nested fragments. In that case, you get those nested fragments via the FragmentManager returned by getChildFragmentManager() called on your fragment, not getSupportFragmentManager() called on your activity.

Upvotes: 2

Related Questions