2013-07-23 13 views
9

Próbuję pobrać fragment mapy Google podczas korzystania z kart w pasku akcji. Kiedy ładuję stronę z kartami, mapa ładuje się dobrze, ale chcę pobrać obiekt mapy, aby można go było wyśrodkować, dodać znaczniki itp.Uzyskiwanie fragmentu mapy Google w onCreateView przy użyciu kart ActionBar

Czy istnieje sposób, aby to zrobić, a jeśli tak, czy ktoś byłby tak miły żeby mi pokazać, jak?

Oto kod na mojej stronie zakładkami ...

Specyficzna metoda pracuję z jest 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; 
     } 
    } 

} 

Oto mój plik XML (maptab.xml), że mam mapę fragment w ...

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

Będzie to bardziej przydatne dla innych osób, jeśli wspomnisz o zamianie swojego pliku SupportMapFragment w maptab.xml za pomocą MapView. – tsil

Odpowiedz

2

Możesz uzyskać odwołanie do fragmentu zawierającego mapę za pomocą mViewPager.getItem(0), a następnie przesłać do fragmentu Map i używać go w dowolny sposób. Ale tak naprawdę nie jest to zbyt dobry projekt, aby operować fragmentem z zewnątrz. Polecam więc wdrożenie całej logiki biznesowej związanej z mapą wewnątrz fragmentu Map, w ten sposób nie musisz rozwiązywać tego rodzaju problemu, który opublikowałeś, a cała logika biznesowa jest zawarta wewnątrz fragmentu, który jest przenośny.

+0

Muszę narysować PolyLine na mapie i dodać znaczniki w zależności od wyboru użytkownika na poprzednich stronach. Właśnie dlatego muszę to zrobić za pomocą kodu. Czy możesz dać mi przykład tego, o czym mówisz? Dzięki. – Zack

+0

Cóż, tak właśnie zrobiłem, tutaj jest bardziej kompletny '((Mapa) mViewPager.getItem (0)). SomeMethod()', gdzie 'someMethod()' może zwrócić ci odwołanie do 'GoogleMap', z którym możesz zrobić byle co. – Desert

+0

Chyba jestem zdezorientowany. Mam '((Map) mViewPager.getItem (0))' ale chce, żebym ustawił go na zmienną. Jak mogę pobrać ten przedmiot i ustawić go jako googlemap? – Zack

Powiązane problemy