2013-10-01 16 views
6
mMapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentByTag(MAP_FRAGMENT_TAG); 

     // We only create a fragment if it doesn't already exist. 
     if (mMapFragment == null) { 
      mMapFragment = SupportMapFragment.newInstance(); 


      // Then we add it using a FragmentTransaction. 
      FragmentTransaction fragmentTransaction = 
        getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.add(MapLay.getId(), mMapFragment, MAP_FRAGMENT_TAG); 
      fragmentTransaction.commit(); 


      mMap=mMapFragment.getMap(); 

przez ten kod mapie jest widoczne, ale nie można uzyskać dostęp do mapyMapFragment powrotu zerowy

MMAP = mMapFragment.getMap(); pokazać błąd wartości zerowej, jak rozwiązać ten

+0

powinno być jak ten mmap = mMapFragment.getMap() –

+0

przepraszam panie to wpisanie pomyłka tutaj, ale muszę napisać poprawny w kodzie –

+0

@RanaRaman Mam dla ciebie przysługę, chcę tylko analizować. Czy możesz przedłużyć 'SupportMapFragment'? Wstaw 'Log' w' onCreate() '. Umieść także dziennik przed 'mMap = mMapFragment.getMap()'. Daj mi znać "Log", który zostanie nazwany jako pierwszy. – Geros

Odpowiedz

17

Aktualizacja 1:getMap() jest przestarzałe

Lepiej jest używać getMapAsync() metoda MapFragment/SupportMapFragment. Przykład użycia metody pokazanej poniżej (skopiowany z ich documentation).

import com.google.android.gms.maps.*; 
import com.google.android.gms.maps.model.*; 
import android.app.Activity; 
import android.os.Bundle; 

public class MapPane extends Activity implements OnMapReadyCallback { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map_activity); 

     MapFragment mapFragment = (MapFragment) getFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     LatLng sydney = new LatLng(-33.867, 151.206); 

     map.setMyLocationEnabled(true); 
     map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); 

     map.addMarker(new MarkerOptions() 
       .title("Sydney") 
       .snippet("The most populous city in Australia.") 
       .position(sydney)); 
    } 

} 

Cytowanie Google MapFragment/SupportMapFragment

GoogleMap można nabyć jedynie za pomocą GetMap(), gdy instrumentem bazowym systemem mapy jest załadowany i podstawowa widok we fragmencie istnieje. Ta klasa automatycznie inicjuje system map i widok; Nie można jednak zagwarantować, że będzie gotowa, ponieważ ta zależy od dostępności pakietu APK usług Google Play. Jeśli GoogleMap nie jest dostępny, funkcja getMap() zwróci wartość null.

Na kodzie, natychmiast odzyskać GoogleMap po popełnieniu MapFragment. Poczekaj, aż MapFragment zostanie w pełni załadowany podczas działania, aby uzyskać GoogleMap.

Być może można dostarczyć GoogleMap z MapFragment do Activity przy użyciu interfejsu, w ten sposób.

public class MyMapFragment extends SupportMapFragment 
{ 
    private MapCallback callback; 

    public void setMapCallback(MapCallback callback) 
    { 
    this.callback = callback; 
    } 

    public static interface MapCallback 
    { 
    public void onMapReady(GoogleMap map); 
    } 

    @Override public void onActivityCreated(Bundle savedInstanceState) 
    { 
    super.onActivityCreated(savedInstanceState); 
    if(callback != null) callback.onMapReady(getMap());  
    } 
} 


public class MyActivity extends Activity implements MyMapFragment.MapCallback 
{ 
    // ......... 
    @Override 
    public void onCreate(Bundle onsavedInstanceState) 
    { 
     mMapFragment = (MyMapFragment) getSupportFragmentManager() 
       .findFragmentByTag(MAP_FRAGMENT_TAG); 

     // We only create a fragment if it doesn't already exist. 
     if (mMapFragment == null) { 
       mMapFragment = MyMapFragment.newInstance(); 

       mMapFragment.setMapCallback(this); // This activity will receive the Map object once the map fragment is fully loaded 

       // Then we add it using a FragmentTransaction. 
       FragmentTransaction fragmentTransaction = 
        getSupportFragmentManager().beginTransaction(); 
       fragmentTransaction.add(MapLay.getId(), mMapFragment, MAP_FRAGMENT_TAG); 
       fragmentTransaction.commit(); 

     } 
     else 
     { 
       mMapFragment.setMapCallback(this); // This activity will receive the Map object once the map fragment is fully loaded 
     } 

    @Override 
    public void onMapReady(GoogleMap map) 
    { 
    // Do what you want to map 
    } 

} 
+0

to proszę mi pokazać jak sprawdzić mapa jest załadowany lub nie –

+0

dodane, można spróbować – Geros

+0

jak o tym, czy Zrobiłem metodę onCreate, setContentView (R.layout.activity_map); w układzie jest fragment, który zostanie załadowany? Czy to działa w ten sposób? –

2

udział importu

import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 

wewnątrz onCreate

SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 
    mMap = mapFragment.getMap(); 

i XML części

<fragment 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     class="com.google.android.gms.maps.SupportMapFragment" /> 

Upewnij się, że włożyłeś w

<meta-data android:name="com.google.android.maps.v2.API_KEY" 
       android:value="api key"/> 

wewnątrz tagów <application></application>.

i dać te uprawnienia w manifet pliku

<permission 
      android:name="packagename.permission.MAPS_RECEIVE" 
      android:protectionLevel="signature"/> 
    <uses-permission android:name="packagename.permission.MAPS_RECEIVE"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true"/> 
+0

tak Użyłem że –

1

Twój xml powinien mieć SupportMapFragment

<fragment 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
+0

Sir Nie używam XML Createing fragment przy starcie –

+0

Należy dodać kod do pompowania układ z fragmentem –

1

, że rozwiązać ten problem, gdy umieścić ten kod:

@Override 
public void onPause() { 

    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map_tab)); 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.remove(fragment); 
    ft.commit(); 
    super.onPause(); 
} 

lub umieścić ten kod onCreate

if (mView != null) { 
    ViewGroup parent = (ViewGroup) mView.getParent(); 
    if (parent != null) { 
     parent.removeView(mView); 
    } 
} 
try { 
    mView = inflater.inflate(R.layout.tab_map_layout, container, false); 
} catch (InflateException e) { 

} 
0

roztwór Bardzo hackish ale, ponieważ ze względu na niską fragment API. ..

Zauważ, że robię to z niestandardowego widoku i uzyskuję dostęp do działania za pomocą (Activity) getContext()

  addOnLayoutChangeListener(new OnLayoutChangeListener(){ 
       @Override 
       public void onLayoutChange(View v, int left, int top, 
         int right, int bottom, int oldLeft, int oldTop, 
         int oldRight, int oldBottom) { 

        GoogleMap map = mapFragment.getMap(); 

        if (map != null) { 
         //Do stuff 
        }else{ 
         removeOnLayoutChangeListener(this); 
        } 
       } 
      }); 
+0

czy mógłbyś być bardziej konkretny? masz na myśli, że gdy mapa zacznie się ładować (co oznacza, że ​​zwróci mapę, a nie null), wywoływana jest funkcja onLayoutChange? Czy jest to zapisane w pliku działań? – unmultimedio

+0

Możesz dodać słuchacza zmiany układu do widoku zawierającego Fragment mapy. – Lumbi

+0

I tak, wygląda na to, że kiedy mapa jest w pełni załadowana, wywoływany jest detektor. W moim przypadku użyłem widoku niestandardowego i dodałem ten kod w metodzie onAttachedToWindow, ale być może możesz zrobić to samo w onCreate działania. – Lumbi

1

Po @Glenn-- komentarzu od 1 października '13 na 6:05, aby utworzyć ten fragment kodu źródłowego.

Moje Wykonanie jest zastąpienie SupportMapFragment z MapFragment i wsparcie Google Maps w wersji 2

chcę pamiętać znowu:

GoogleMap można nabyć jedynie za pomocą GetMap(), gdy instrumentem bazowym systemem map jest załadowany, a ukryty widok w fragmencie istnieje. Ta klasa automatycznie inicjuje system map i widok; nie można jednak zagwarantować, kiedy będzie gotowa, ponieważ zależy to od dostępności pakietu APK usług Google Play. Jeśli GoogleMap nie jest dostępny, getMap() zwróci wartość null.

Moje Wykonanie:

AndroidManifest.xml

<!-- Permissions --> 

<!-- Used by the Google Maps API to download map tiles from Google Maps servers. --> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

<!-- Allows the Google Maps API to check the connection status in order to determine whether data can be downloaded. --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

<!-- Allows the Google Maps API to cache map tile data in the device's external storage area. --> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

<!-- Allows the Google Maps API to use WiFi or mobile cell data (or both) to determine the device's location. --> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

<!-- Allows the Google Maps API to use the Global Positioning System (GPS) to determine the device's location to within a very small area. --> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<!-- Permissions --> 

<!-- Required OpenGL ES 2.0. for Maps V2 --> 
<!-- 
    The Google Maps Android API uses OpenGL ES version 2 to render the map. 
    If OpenGL ES version 2 is not installed, your map will not appear. 
    sWe recommend that you add the following <uses-feature> element as a child of the <manifest> element in AndroidManifest.xml: 
--> 
<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true"/> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <!-- Google Play Services --> 
    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 

    <!-- Goolge Maps API Key --> 
    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="AIzaSyATC4WBLLewjdwYDFVTnJH8hA18gG_GgvY" /> 

</application> 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="mapa.bg.MapaMainActivity" 
    android:background="#ccc"> 

    <!-- Google Map Container --> 
    <RelativeLayout 
     android:id="@+id/google_map_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
    <!-- Google Map Container --> 
</RelativeLayout> 

ApplicationMapFragment.java

public class ApplicationMapFragment extends MapFragment { 

    private MapCallback callback; 

    public void setMapCallback(MapCallback callback) { 
     this.callback = callback; 
    } 

    public static interface MapCallback { 
     public void onMapReady(GoogleMap map); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if(callback != null) callback.onMapReady(getMap()); 
    } 

    /** 
    * Initialize default Google Maps Options for our Application 
    * @return GoogleMapOptions 
    */ 
    public GoogleMapOptions initializeGoogleMapsOptions() { 
     GoogleMapOptions googleMapOptions = new GoogleMapOptions() 
      .mapType(GoogleMap.MAP_TYPE_HYBRID); 

     return googleMapOptions; 
    } 
} 

MainActivity.java

public class MainActivity extends Activity implements ApplicationMapFragment.MapCallback { 

    // Get Class Name 
    private static String TAG = MainActivity.class.getName(); 

    // Create a new Map fragment 
    private ApplicationMapFragment mapFragment; 

    // Google Map Fragment Name 
    private static String MAP_FRAGMENT_TAG = "google_maps_fragment"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     try { 
       initilizeMapFragment(); 
     } catch (Exception e) { 
       e.printStackTrace(); 
       Log.e(TAG, "Google Maps can't be loaded", e); 
     } 
    } 

    /** 
    * Initialize a new Map Fragment 
    */ 
    private void initilizeMapFragment() { 

     // Try to get Map Fragment 
     mapFragment = (ApplicationMapFragment) getFragmentManager() 
       .findFragmentByTag(MAP_FRAGMENT_TAG); 

     // We only create a fragment if it doesn't already exist. 
     if (mapFragment == null) { 
      mapFragment = new ApplicationMapFragment(); 
      mapFragment.initializeGoogleMapsOptions(); 

      // This activity will receive the Map object once the map fragment is fully loaded 
      mapFragment.setMapCallback(this); 

      // Then we add it using a FragmentTransaction. 
      FragmentTransaction fragmentTransaction = 
        getFragmentManager().beginTransaction(); 
      fragmentTransaction.add(R.id.google_map_container, mapFragment, MAP_FRAGMENT_TAG); 
      fragmentTransaction.commit(); 
     } else { 
      // This activity will receive the Map object once the map fragment is fully loaded 
      mapFragment.setMapCallback(this); 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     Log.d(TAG, "Google Map is loaded"); 

     MarkerOptions marker = new MarkerOptions() 
      .position(new LatLng(10, 10)) 
      .title("Hello World"); 

     map.addMarker(marker); 
    } 
}