2013-05-28 7 views
7

Ich versuche Google Maps v2 in meiner App arbeiten. Ich habe mehrere Beispiele gesehen, die zeigen, wie Sie SupportMapFragment in einer Aktivität öffnen können. Die Idee dahinter ist, dass Ihre Tätigkeit setContentView(R.layout.map_layout); nennen, wo map_layout.xml Anschluss an das Fragment mit den Zeilen:Google Maps in einem actionbarsherlock Registerkarte

android:name="com.google.android.gms.maps.SupportMapFragment" 
     xmlns:map="http://schemas.android.com/apk/res-auto" 

Der „name =“ effektiv Linie sagt, dass „dieses Layout durch ein Fragment des Typs gesteuert werden soll ' SupportMapFragment '".

Meine Komplikation ist, dass ich versuche, die Karte in einer Aktivität mit Registerkarten (mit actionbarsherlock implementiert) angezeigt werden. Das bedeutet, dass jedes Fragment, das einer Tab-Auswahl entspricht, einen TabListener implementieren muss. Aber SupportMapFragment nicht. So, jetzt vermutlich muss ich wie so ein neues Fragment erstellen:

public class MyMapFragmentWithTabListener extends SupportMapFragment implements TabListener 
{ 

Aber jetzt habe ich habe alle verwirrt darüber, wie die Inhalte von MapFragmentWithTabListener insbesondere onCreateView zu schreiben ... sollte ich etwas Layout werden aufblasen? Sicherlich kann ich nicht genau die gleiche map_layout.xml aus den Beispielen aufblasen, da diese bereits deklariert, dass sie von SupportMapFragment gesteuert wird, während sie in dieser Implementierung von MyMapFragmentWithTabListener gesteuert werden soll - brauche ich eine etwas andere XML-Datei zum inflationieren (wenn also, wie sollte es aussehen?) - oder soll ich meine Sicht programmatisch erstellen?

+0

Warum benötigen Sie Ihre Fragmente, um TabListener zu implementieren? – AMerle

+0

Sie können immer rohe 'MapView' verwenden. Gibt es einen Grund, warum du 'SupportMapFragment' benutzen musst? – Izydorr

+0

Ich denke der folgende Beitrag sollte dir helfen. http://stackoverflow.com/questions/13721929/using-actionbarsherlock-with-the-new-supportmapfragment – blganesh101

Antwort

5

Ich habe dies in einigen Anwendungen jetzt getan. Anstatt SupportMapFragment zu erweitern, erstellen Sie einfach Ihr eigenes MapFragment. Sie können Ihr eigenes Layout mit einer MapView-Ansicht darin erstellen. Der Schlüssel ist, die Lebenszyklusereignisse des Fragments an die MapView zu routen, und Ihr Onkel.

Heres einige Beispiel-Code:

MapFragment

package com.example.testapplication; 

import java.util.concurrent.TimeUnit; 

import com.google.android.gms.common.GooglePlayServicesNotAvailableException; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapView; 
import com.google.android.gms.maps.MapsInitializer; 


public class TestMapFragment extends Fragment { 

    private MapView mMapView; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 


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

     mMapView = (MapView) view.findViewById(R.id.mapview); 

     // inflat and return the layout 
     mMapView.onCreate(savedInstanceState); 
     mMapView.onResume();// needed to get the map to display immediately 

     try { 
      MapsInitializer.initialize(getActivity()); 
     } catch (GooglePlayServicesNotAvailableException e) { 
      e.printStackTrace(); 
     } 
     GoogleMap googleMap = mMapView.getMap(); 
     googleMap.getUiSettings().setMyLocationButtonEnabled(true); 
     return view; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    /* 
    * Using a mapview in a fragment requires you to 'route' 
    * the lifecycle events of the fragment to the mapview 
    */ 
    @Override 
    public void onResume() { 
     super.onResume(); 
     if (null != mMapView) 
      mMapView.onResume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (null != mMapView) 
      mMapView.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (null != mMapView) 
      mMapView.onDestroy(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     if (null != mMapView) 
      mMapView.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     if (null != mMapView) 
      mMapView.onLowMemory(); 
    } 
} 

Und das Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:map="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <com.google.android.gms.maps.MapView 
     android:id="@+id/mapview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     map:uiZoomControls="false" /> 
</RelativeLayout> 
+0

Bob ist nicht mein Onkel. –

0

Sie auf diese Weise verwendet werden.

public class NewActivity extends FragmentActivity { 
private GoogleMap mMap; 
SupportMapFragment mapFragment; 

    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
       this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       setContentView(R.layout.activit); 

     mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 
     if(isGooglePlayServicesIsInstalled(mContext)){ 
      mMap = mapFragment.getMap(); 
      mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
      mMap.getUiSettings().setCompassEnabled(true); 
      mMap.getUiSettings().setZoomControlsEnabled(true); 
     }else{ 
       //display any toast message 
       //Global.Toast("Please First install Google Maps"); 
      } 



public static boolean isGooglePlayServicesIsInstalled(Context context){ 
     int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context); 
     if (resultCode == ConnectionResult.SUCCESS) 
      return true; 
     else 
      return false; 
    } 

Bitte überprüfen Sie es heraus alle Erlaubnis, api Schlüssel und erfordern die ganze Sache .wenn Sie ein Fehlerprotokoll dann als Kommentar gesetzt bekommen.