2015-05-06 51 views
2

已更新 我讀了很多主題,但沒有任何幫助,或者我不明白該怎麼做。我得到空,我不知道爲什麼。我只是在學習,所以請幫助我。谷歌地圖getMap返回null

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference 
     at com.example.text.fragments.MapFragment.initilizeMap(MapFragment.java:52) 
     at com.example.text.fragments.MapFragment.onViewCreated(MapFragment.java:46) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:971) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) 
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499) 
     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:488) 
     at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
     at android.support.v4.view.ViewPager$3.run(ViewPager.java:249) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:792) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:596) 
     at android.view.Choreographer.doFrame(Choreographer.java:556) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:778) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:155) 
     at android.app.ActivityThread.main(ActivityThread.java:5696) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) 

這是片段,我實現的GetMap

public class MapFragment extends Fragment implements OnMapReadyCallback{ 

    private GoogleMap googleMap; 
    /** 
    * function to load map. If map is not created it will create it for you 
    * */ 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.map_fragment, container, false); 
     return view; 
    } 
    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onViewCreated(view, savedInstanceState); 
     // here, as doc say, the map can be initialized, or the service is not available 
     initilizeMap(); 
    } 

    private void initilizeMap() { 
     if (googleMap == null) { 
      ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(
        R.id.map)).getMapAsync(this); 

      // check if map is created successfully or not 
      if (googleMap == null) { 
       Toast.makeText(getActivity().getApplicationContext(), 
         "Sorry! unable to create maps", Toast.LENGTH_SHORT) 
         .show(); 
      } 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap mGoogleMap) { 
     googleMap = mGoogleMap; 
    } 
} 

這是map_fragment.xml

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

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


</RelativeLayout> 

這是我的清單

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.test" > 

    <permission 
     android:name="com.example.test.permission.MAPS_RECEIVE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="com.example.test.permission.MAPS_RECEIVE" /> 

    <uses-sdk 
     android:minSdkVersion="17" 
     android:targetSdkVersion="22" /> 

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <!-- Required to show current location --> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

    <!-- Required OpenGL ES 2.0. for Maps V2 --> 
    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" 
     android:supportsRtl="true"> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

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

    </application> 

</manifest> 

我使用滑動凸耳一個標籤必須有ma頁。我在這部分代碼在ViewPagerAdapter製作這份地圖:

@Override 
    public Fragment getItem(int position) { 

     if(mNumbOfTabs == 3) { 
      if (position == 0) { 
       A a = new A(); 
       return a; 
      } else if (position == 1) { 
       B b = new B(); 
       return b; 
      } else { 
       MapFragment mapFragment = new MapFragment(); 
       return mapFragment; 
      } 
    } 
+1

move'initilizeMap();'in'onCreateView(......)' –

+2

自Play Services 6.5開始,您應該使用'getMapAsync'而不是'getMap'。 – stkent

+0

我做到了,仍然是相同的日誌。 – ThirdMartian

回答

5

由於現在不推薦使用Google Play服務的Google版本recommends using of asynchronous getting of GoogleMapgetMap()。由於提及stkent,您必須致電getMapAsync(this)

由於此方法異步,因此您需要對此方法進行一些回調,這就是爲什麼您還必須使片段實現OnMapReadyCallback以及在這些回調的方法onMapReady()中可以獲得對地圖的引用。

此外,更改行((SupportMapFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);因爲內部片段,你必須使用ChildFragmentManager。

+0

我這樣做了:@Override public void onMapReady(GoogleMap mGoogleMap){ googleMap = mGoogleMap; } }); 但仍然是同樣的問題 – ThirdMartian

+0

粘貼新代碼和新例外 –

+0

我更新了上面的代碼。 – ThirdMartian

2

我有同樣的問題,與谷歌地圖V2,你應該使用getExtendedMap()來代替。嘗試這個。

+0

我沒有這個方法 – ThirdMartian

+1

@Mateus Brandao:'getExtendedMap()'是一種* Android地圖擴展*的方法:https:// code .google.com/p/android-maps-extensions/not * Google Maps Android API v2 * – Rami

相關問題