2013-10-01 49 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(); 

通過該碼圖是可見的,但無法訪問地圖MapFragment返回null

MMAP = mMapFragment.getMap();顯示空值錯誤如何解決內部的OnCreate

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

和XML的一部分。這

+0

它應該是這樣的MMAP = mMapFragment.getMap() –

+0

對不起,先生,這是打錯了這裏,但我有寫代碼 –

+0

正確@RanaRaman我對你有幫助,只是想分析一下。你能擴展'SupportMapFragment'嗎?在'onCreate()'中放入一個'Log'。在'mMap = mMapFragment.getMap()'之前放一個日誌。讓我知道「日誌」被首先調用。 – Geros

回答

17

更新1:getMap()棄用

這是更好地使用getMapAsync()的方法MapFragment/SupportMapFragment。示例如何使用下面顯示的方法(從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)); 
    } 

} 

引用谷歌的MapFragment/SupportMapFragment

甲GoogleMap的只能使用的GetMap獲取()當底層 地圖系統被加載並在該片段中的底層視圖存在。 這個類自動初始化地圖系統和視圖; 但是,當它準備就緒時,無法保證,因爲此 取決於Google Play服務APK的可用性。如果一個 谷歌地圖不可用,getMap()將返回null。

在您的代碼上,您立即檢索GoogleMap AFTER Committing MapFragment。等到MapFragment完成加載活動,以便您可以獲得GoogleMap

也許,你可以使用接口,像這樣將GoogleMapMapFragment傳送到Activity

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

充氣佈局能不能請你告訴我怎麼查地圖添加代碼或不 –

+0

增加,你可以嘗試 – Geros

+0

怎麼樣,如果我做了onCreate方法,setContentView(R.layout.activity_map);在佈局中有一個將被加載的片段?它是這樣工作的 –

2

進口部分

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

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

確保你已經把

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

你的<application></application>標籤。

和manifet文件給這些權限

<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

是的,我已經使用了 –

1

你的XML應該有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

先生,我不使用XML在運行時 –

+0

Createing片段請加載從片段 –

1

我解決了這個問題,當我把這個代碼:

@Override 
public void onPause() { 

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

或者我把這個代碼的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

真的hackish的解決方案,但是,因爲給出的片段API差。 ..

請注意,我從一個自定義視圖執行此操作並使用(Activity)getContext()訪問Activity

  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

你可以更具體一點嗎?你的意思是一旦地圖開始加載(意味着它將返回地圖,而不是空),onLayoutChange被調用?這是寫在一個活動文件上嗎? – unmultimedio

+0

您可以將Layout Change Listener添加到包含Map碎片的視圖中。 – Lumbi

+0

是的,它看起來像地圖完全加載時,監聽器被調用。在我的例子中,我使用了一個自定義視圖,並在onAttachedToWindow方法中添加了這段代碼,但也許你可以在一個Activity的onCreate中做同樣的事情。 – Lumbi

1

繼2013年10月1日在6:05創建這段源代碼的評論。

我的實現與MapFragment更換SupportMapFragment,支持谷歌地圖版本2

我想再次記住:

一個GoogleMap的只能使用的GetMap()當底層的地圖系統是被收購加載並且片段中的底層視圖存在。這個類自動初始化地圖系統和視圖;但無法保證它準備就緒,因爲這取決於Google Play服務APK的可用性。如果GoogleMap不可用,則getMap()將返回null。

我的實現:

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