Cómo obtener fragmentos de mapas de Google en onCreateView con las pestañas de ActionBar
Estoy tratando de recuperar el fragmento Google Map mientras utilizaba Tabs en una ActionBar. Cuando carga la página con pestañas, el mapa se carga bien, pero quiero obtener el objeto del mapa para poder centrarlo, añadir marcadores, etc.
¿Hay una manera de hacer esto y si hay, alguien sería tan amable para mostrarme cómo?
- Aplicación para Android con direcciones de voz GPS
- Android: automáticamente elige debug / release Maps v2 api key?
- Cómo dibujar Polyline interactivo en la ruta google maps v2 android
- Android: java.lang.NoClassDefFoundError: com.google.android.gms.R $ styleable
- ¿Cómo hacer que el marcador aparezca en el centro de la ventana inicial de Google Map?
Aquí está el código de mi página con pestañas …
El método específico con el que estoy trabajando es 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; } } }
Aquí está mi archivo XML (maptab.xml) que tengo mi fragmento de mapa en …
<?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>
Resuelto
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(); } }
- Cómo invertir Geocode en google maps api 2 android
- android marker custom infowindow
- API de Google Maps para Android: ocultar fragmento de marcador
- ¿Debo usar MapView o MapFragment
- GoogleMap dentro de un fragmento en un ViewPager, guarda todos los eventos de toque en GoogleMap
- Cómo cambiar el color de un área en particular en Google map api v2 en android
- Android java.io.IOException: Servicio no disponible
- ¿Cómo mostrar múltiples marcadores con diferentes iconos en Google Maps Android API v2?
Puedes obtener referencia al fragmento que contiene tu mapa usando mViewPager.getItem(0)
y luego mViewPager.getItem(0)
al fragmento de Map
y usarlo como quieras. Pero esto no es realmente muy buen diseño para operar en el fragmento desde el exterior. Así que te recomiendo que implementes toda la lógica de negocio relacionada con el mapa dentro del fragmento de Map
, de esta manera no necesitas resolver ese tipo de problema, que publicaste y toda tu lógica de negocio está encapsulada dentro de un fragmento, que es portátil.
- Mi aplicación se redujo significativamente en Android 4.0
- Haga la lista desplazable en forma circular usando libgdx