Получение фрагмента карты Google в onCreateView с помощью вкладок ActionBar

Я пытаюсь извлечь фрагмент карты Google, используя вкладки в ActionBar. Когда я загружаю вкладку, карта загружается отлично, но я хочу получить объект карты, чтобы я мог сосредоточить ее, добавить маркеры и т. Д.

Есть ли способ сделать это, и если есть, кто-нибудь будет так добр, чтобы показать мне, как это сделать?

Вот код моей вкладки …

Конкретный метод, с которым я работаю, – это 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; } } } 

Вот мой XML-файл (maptab.xml), в котором у меня есть фрагмент карты …

 <?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> 

РЕШИТЬ

  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(); } } 

Solutions Collecting From Web of "Получение фрагмента карты Google в onCreateView с помощью вкладок ActionBar"

Вы можете получить ссылку на фрагмент, содержащий вашу карту, с помощью mViewPager.getItem(0) а затем отбросить фрагмент Map и использовать его любым способом. Но на самом деле это не очень хороший дизайн для работы с фрагментом снаружи. Поэтому я бы рекомендовал вам реализовать всю бизнес-логику, связанную с картой внутри фрагмента Map , таким образом, вам не нужно решать такую ​​проблему, которую вы опубликовали, и вся ваша бизнес-логика инкапсулирована внутри фрагмента, который является переносимым.