Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting Google Map Fragment in onCreateView using ActionBar tabs

I'm trying to retrieve the Google Map fragment while using Tabs in an ActionBar. When I load the tabbed page the map loads fine, but I want to get the map object so I can center it, add markers etc.

Is there a way to do this and if there is, would somebody be so kind to show me how?

Here's the code for my tabbed page...

The specific method I'm working with is public static class Map extends Fragment

public class Page3Activity extends FragmentActivity implements ActionBar.TabListener {  

    final Context context = this;
    static GoogleMap map;
    static MapView mMapView;
    DatabaseHandler db = new DatabaseHandler(context);

    AppSectionsPagerAdapter mAppSectionsPagerAdapter;
    ViewPager mViewPager;

    @SuppressLint("NewApi")
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
        setContentView(R.layout.page3);

        // Create the adapter that will return a fragment for each of the three primary sections
        // of the app.
        mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());

        ColorDrawable colorDrawable = new ColorDrawable();
        final ActionBar actionBar = getActionBar();
        colorDrawable.setColor(0xff9ACC00);
        actionBar.setBackgroundDrawable(colorDrawable);
        actionBar.setTitle("Road Trip Calculator");
        actionBar.setSubtitle("Trip Information");
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE );

     // Specify that the Home/Up button should not be enabled, since there is no hierarchical
        // parent.
        actionBar.setHomeButtonEnabled(false);

        // Specify that we will be displaying tabs in the action bar.
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Set up the ViewPager, attaching the adapter and setting up a listener for when the
        // user swipes between sections.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                // When swiping between different app sections, select the corresponding tab.
                // We can also use ActionBar.Tab#select() to do this if we have a reference to the
                // Tab.
                actionBar.setSelectedNavigationItem(position);
            }
        });

        // For each of the sections in the app, add a tab to the action bar.
        for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) {
            // Create a tab with text corresponding to the page title defined by the adapter.
            // Also specify this Activity object, which implements the TabListener interface, as the
            // listener for when this tab is selected.
            actionBar.addTab(
                    actionBar.newTab()
                            .setText(mAppSectionsPagerAdapter.getPageTitle(i))
                            .setTabListener(this));
        }

    }

    /*
     * ACTIONBAR TOP BAR CODE
     */


    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in the ViewPager.
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to one of the primary
     * sections of the app.
     */
    public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

        public AppSectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        //Switching between tabs
        @Override
        public Fragment getItem(int i) {
            switch (i) {
                case 0:
                    return new Map();
                case 1:
                    return new Directions();
                case 2:
                    return new poiList();
                case 3:
                    return new tripInfo();
                default:
                    i=i+1;
            }
            return null;
        }

        @Override
        public int getCount() {
            return 4;
        }

        @Override
        public String getPageTitle(int position) {
            String tabName = "";
            if(position == 0) {
                tabName = "Map";
            } else if(position == 1) {
                tabName = "Directions";
            } else if(position == 2) {
                tabName = "POI List";
            } else if(position == 3) {
                tabName = "Trip Info";
            }
            return tabName;

        }
    }

    /**
     * Map
     */
    public static class Map extends Fragment {

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

            //I want to be able to do something like this...
            /* 
            GoogleMap map;
            SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map1);
            map = fm.getMap();
            map.DOSOMETHING
            */


            return rootView;
        }
    }

    /**
     * Directions
     */

    public static class Directions extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.directionstab, container, false);
                ((TextView) rootView.findViewById(android.R.id.text1)).setText(
                "directions");
            return rootView;
        }
    }

    /**
     * POI List
     */

    public static class poiList extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.poitab, container, false);
                ((TextView) rootView.findViewById(android.R.id.text1)).setText(
                "poiList");
            return rootView;
        }
    }

    /**
     * Trip Info
     */

    public static class tripInfo extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.tripinfotab, container, false);
            ((TextView) rootView.findViewById(android.R.id.text1)).setText(
            "Trip Info");
            return rootView;
        }
    }

}

Here is my XML file (maptab.xml) that I have my map fragment in...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

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

</LinearLayout>

SOLVED

    public static class Map extends Fragment {
        MapView mapView;
        GoogleMap map;

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

            // Gets the MapView from the XML layout and creates it
            mapView = (MapView) v.findViewById(R.id.mapview);
            mapView.onCreate(savedInstanceState);

            // Gets to GoogleMap from the MapView and does initialization stuff
            map = mapView.getMap();
            //map.getUiSettings().setMyLocationButtonEnabled(false);
            //map.setMyLocationEnabled(true);
            map.addMarker(new MarkerOptions().position(new LatLng(50.167003,19.383262)));


            // Needs to call MapsInitializer before doing any CameraUpdateFactory calls
            try {
                MapsInitializer.initialize(this.getActivity());
            } catch (GooglePlayServicesNotAvailableException e) {
                e.printStackTrace();
            }

            // Updates the location and zoom of the MapView
            CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(43.1, -87.9), 10);
            map.animateCamera(cameraUpdate);

            return v;
        }

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

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

        @Override
        public void onLowMemory() {
            super.onLowMemory();
            mapView.onLowMemory();
        }
    }
like image 905
Zack Avatar asked Jul 23 '13 20:07

Zack


1 Answers

You can get reference to the fragment containing your Map using mViewPager.getItem(0) and then cast to Map fragment and use it any way you like. But this is actually not very good design to operate on fragment from the outside. So I would recommend you to implement all the business logic related to map inside Map fragment, this way you don't need to solve that kind of issue, that you posted and all you business logic is encapsulated inside a fragment, which is portable.

like image 167
Desert Avatar answered Sep 23 '22 07:09

Desert