2013-07-23 7 views
9

ActionBarのタブを使用してGoogleマップのフラグメントを取得しようとしています。タブ付きのページを読み込むとマップが正常にロードされますが、マップオブジェクトを取得して、マーカーを追加できるようにしたいのですがActionBarタブを使用してonCreateViewでGoogle Map Fragmentを取得する

これを行う方法はありますか?どのように私を見せる?

ここに私のタブ付きページのコードは、私が働いている具体的な方法は、ここで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(); 
     } 
    } 
+4

maptab.xmlのSupportMapFragmentをMapViewで置き換えると言えば、他の人にとってはもっと便利です。 – tsil

答えて

2

mViewPager.getItem(0)を使用してマップを含むフラグメントを参照し、Mapフラグメントにキャストして好きなように使用できます。しかし、これは実際には、外部からの断片を操作するための非常に良い設計ではありません。ですから、Mapフラグメント内のマップに関連するすべてのビジネスロジックを実装することをお勧めします。このように問題を解決する必要はありません。投稿し、すべてのビジネスロジックを移植可能なフラグメントにカプセル化します。

+0

地図上にPolyLineを描画し、前のページのユーザーの選択に応じてマーカーを追加する必要があります。だから私はコードを使ってそれを行う必要があります。あなたが話していたことの例を私に教えてもらえますか?ありがとう。 – Zack

+0

さて、実際には、ここで 'someMethod()'は 'GoogleMap'への参照を返すことができるより完全な'((Map)mViewPager.getItem(0))。someMethod() 'です。何でも – Desert

+0

私は混乱していると思います。私は '((Map)mViewPager.getItem(0))'を持っていますが、変数に設定したいと思っています。そのアイテムを取得してgooglemapと同じに設定するにはどうすればよいですか? – Zack

関連する問題