Android Drawer Example, how to implement Google Map Fragment

12,961

If you want to use maps within the fragment class you should use MapView.

MapView mapView;

GoogleMap googleMap;

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

        mapView = (MapView) view.findViewById(R.id.map);

            mapView.onCreate(savedInstanceState);

            if(mapView!=null)
            {
                googleMap = mapView.getMap();

                googleMap.getUiSettings().setMyLocationButtonEnabled(false);

                googleMap.setMyLocationEnabled(true);

                googleMap.getUiSettings().setZoomControlsEnabled(true);
            }

        return view;

    }

  @Override
    public void onResume() 
    {
        mapView.onResume();

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

        mapView.onDestroy();
    }
    @Override
    public void onLowMemory() 
    {
        super.onLowMemory();

        mapView.onLowMemory();
    }

In your xml file paste code below

<?xml version="1.0" encoding="utf-8"?>
<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" >

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

</RelativeLayout>

try this you will see a good result...

Share:
12,961
Admin
Author by

Admin

Updated on July 17, 2022

Comments

  • Admin
    Admin almost 2 years

    Actually I am trying to implement Google Map on Android Drawer example, basically I would like to show a map by selecting the first menu item. All the provided examples are using the FragmentActivity for all maps, I arranged to extend the Fragment Class (used by the drawer), creating a class suitable for Map. Unfortunately the App crash on launch:

    Main Activity

    public class HLMainActivity extends ActionBarActivity implements
        NavigationDrawerFragment.NavigationDrawerCallbacks {
    
    /**
     * Fragment managing the behaviors, interactions and presentation of the
     * navigation drawer.
     */
    private NavigationDrawerFragment mNavigationDrawerFragment;
    
    /**
     * Used to store the last screen title. For use in
     * {@link #restoreActionBar()}.
     */
    private CharSequence mTitle;
    
    public static FragmentManager fragmentManager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hlmain);
    
        // initialising the object of the FragmentManager. Here I'm passing getSupportFragmentManager(). You can pass getFragmentManager() if you are coding for Android 3.0 or above.
        fragmentManager = getSupportFragmentManager();
    
        mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager()
                .findFragmentById(R.id.navigation_drawer);
        mTitle = getTitle();
    
        // Set up the drawer.
        mNavigationDrawerFragment.setUp(R.id.navigation_drawer,
                (DrawerLayout) findViewById(R.id.drawer_layout));
    }
    
    @Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        fragmentManager = getSupportFragmentManager();
    
        HLMainMapFragment fragment = new HLMainMapFragment();
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, fragment).commit();
    
    }
    
    public void onSectionAttached(int number) {
        switch (number) {
        case 1:
            mTitle = getString(R.string.title_section1);
            break;
        case 2:
            mTitle = getString(R.string.title_section2);
            break;
        case 3:
            mTitle = getString(R.string.title_section3);
            break;
        }
    }
    
    public void restoreActionBar() {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle(mTitle);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!mNavigationDrawerFragment.isDrawerOpen()) {
            // Only show items in the action bar relevant to this screen
            // if the drawer is not showing. Otherwise, let the drawer
            // decide what to show in the action bar.
            getMenuInflater().inflate(R.menu.hlmain, menu);
            restoreActionBar();
            return true;
        }
        return super.onCreateOptionsMenu(menu);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }   
    
    }
    

    Map Fragment

    public class HLMainMapFragment extends Fragment {
    private static View view;
    /**
     * Note that this may be null if the Google Play services APK is not
     * available.
     */
    
    private static GoogleMap mMap;
    private static Double latitude, longitude;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
    
        view = (RelativeLayout) inflater.inflate(R.layout.location_fragment,
                container, false);
        // Passing harcoded values for latitude & longitude. Please change as
        // per your need. This is just used to drop a Marker on the Map
        latitude = 26.78;
        longitude = 72.56;
    
        setUpMapIfNeeded(); // For setting up the MapFragment
    
        return view;
    }
    
    /***** Sets up the map if it is possible to do so *****/
    public static void setUpMapIfNeeded() {
    
        // Do a null check to confirm that we have not already instantiated the
        // map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) HLMainActivity.fragmentManager
                    .findFragmentById(R.id.map)).getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null)
                setUpMap();
        }
    }
    
    /**
     * This is where we can add markers or lines, add listeners or move the
     * camera.
     * <p>
     * This should only be called once and when we are sure that {@link #mMap}
     * is not null.
     */
    private static void setUpMap() {
        // For showing a move to my loction button
        mMap.setMyLocationEnabled(true);
        // For dropping a marker at a point on the Map
        mMap.addMarker(new MarkerOptions()
                .position(new LatLng(latitude, longitude)).title("My Home")
                .snippet("Home Address"));
        // For zooming automatically to the Dropped PIN Location
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(
                latitude, longitude), 12.0f));
    }
    
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        if (mMap != null)
            setUpMap();
    
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) HLMainActivity.fragmentManager
                    .findFragmentById(R.id.map)).getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null)
                setUpMap();
        }
    }
    
    /****
     * The mapfragment's id must be removed from the FragmentManager or else if
     * the same it is passed on the next time then app will crash
     ****/
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (mMap != null) {
            HLMainActivity.fragmentManager
                    .beginTransaction()
                    .remove(HLMainActivity.fragmentManager
                            .findFragmentById(R.id.map)).commit();
            mMap = null;
        }
    }
    }
    

    Location Fragment XML

    <?xml version="1.0" encoding="utf-8"?>
    <MapFragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.MapFragment" />
    

    LogCat

        04-14 16:43:36.984: E/AndroidRuntime(1159): FATAL EXCEPTION: main
        04-14 16:43:36.984: E/AndroidRuntime(1159): Process: com.studiohangloose.iMobility, PID: 1159
        04-14 16:43:36.984: E/AndroidRuntime(1159): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.studiohangloose.iMobility/com.studiohangloose.iMobility.HLMainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class MapFragment
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.os.Handler.dispatchMessage(Handler.java:102)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.os.Looper.loop(Looper.java:136)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.app.ActivityThread.main(ActivityThread.java:5017)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at java.lang.reflect.Method.invokeNative(Native Method)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at java.lang.reflect.Method.invoke(Method.java:515)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at dalvik.system.NativeStart.main(Native Method)
        04-14 16:43:36.984: E/AndroidRuntime(1159): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class MapFragment
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:707)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at com.studiohangloose.iMobility.HLMainMapFragment.onCreateView(HLMainMapFragment.java:33)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:570)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.app.Activity.performStart(Activity.java:5241)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     ... 11 more
        04-14 16:43:36.984: E/AndroidRuntime(1159): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.MapFragment" on path: DexPathList[[zip file "/data/app/com.studiohangloose.iMobility-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.studiohangloose.iMobility-2, /system/lib]]
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.view.LayoutInflater.createView(LayoutInflater.java:559)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.view.LayoutInflater.onCreateView(LayoutInflater.java:652)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
        04-14 16:43:36.984: E/AndroidRuntime(1159):     ... 23 more
    

    Any suggestion!? Or maybe a link to the solution...

  • Siddhartha Moraes
    Siddhartha Moraes almost 9 years
    Man, you answer was perfect!!