2017-10-04 33 views
0

私のコードにGoogleMapオブジェクトを実装しようとしています。 getMapASync()を使用して、onMapReady()コールで作成したマップを使用したいGoogleMapオブジェクトに割り当てると、そのメソッド内で動作しますが、そのメソッドの外で参照すれば、まだnullです。どうして? パブリッククラスMainActivityはAppCompatActivityがメソッドの終了後にonMapReady()の代入が終了しない

は私が取得エラーメッセージはこれですOnMapReadyCallback {

GoogleMap mMap; 
private static final int ERROR_DIALOG_REQUEST = 9001; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(servicesOK()) { 
     setContentView(R.layout.activity_map); 
     if (initMap()) { 
      Toast.makeText(this, "Ready to map", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(this, "Map not connected", Toast.LENGTH_SHORT).show(); 

     } 
    } 
    else{ 
     setContentView(R.layout.activity_main); 
    } 
String mapType2 = Integer.toString(mMap.getMapType()); 
    Toast.makeText(this, mapType2 + " mMap", Toast.LENGTH_SHORT).show(); 
//This is for debugging purposes 
} 


public boolean servicesOK(){ 
    int isAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 

    if(isAvailable == ConnectionResult.SUCCESS){ 
     return true; 
    } 
    else if (GooglePlayServicesUtil.isUserRecoverableError(isAvailable)){ 
     Dialog dialog = GooglePlayServicesUtil.getErrorDialog(isAvailable,this,ERROR_DIALOG_REQUEST); 
     dialog.show(); 
    } 
    else{ 
     Toast.makeText(this, "Can't connect to mapping service", Toast.LENGTH_SHORT).show(); 
    } 

    return false; 
} 

private boolean initMap(){ 
    if(mMap == null){ 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 
    return (mMap != null); 
} 
@Override 
public void onMapReady(GoogleMap map) { 
    this.mMap = map; 

} 

}を実装して拡張します

FATAL EXCEPTION: main 
                     Process: com.ramaya947yahoo.mymaps, PID: 1037 
                     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ramaya947yahoo.mymaps/com.ramaya947yahoo.mymaps.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.google.android.gms.maps.GoogleMap.getMapType()' on a null object reference 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2452) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535) 
                      at android.app.ActivityThread.access$900(ActivityThread.java:155) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:152) 
                      at android.app.ActivityThread.main(ActivityThread.java:5497) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.google.android.gms.maps.GoogleMap.getMapType()' on a null object reference 
                      at com.ramaya947yahoo.mymaps.MainActivity.onCreate(MainActivity.java:34) 
                      at android.app.Activity.performCreate(Activity.java:6289) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2405) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)  
                      at android.app.ActivityThread.access$900(ActivityThread.java:155)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:152)  
                      at android.app.ActivityThread.main(ActivityThread.java:5497)  
                      at java.lang.reflect.Method.invoke(Native Method)  
+0

私はNullPointerExceptionが何であるかを理解していますが、割り当て後にまだNullPointerExceptionが残っていた理由を尋ねていました。リンク先のポストは、同じ問題を抱えている他の人には役に立ちませんが、入力に感謝します。 –

答えて

0

そのあなたがonCreate

String mapType2 = Integer.toString(mMap.getMapType()); 

をivokingされているのでマップがまだ初期化されていないときのメソッドializerも割り当てられません。 これは活動が既に作成された後にいくつかの時間と呼ばれるなど、すべてのマップの初期化に関連するコードが

@Override 
public void onMapReady(GoogleMap map) { 
    this.mMap = map; 
//here 

} 

に配置する必要があります。

+0

私は今理解しています、明確化のためにありがとう! –

+0

私はLynda.comのチュートリアルに従っています。元のやり方で試したところ、getMapASync()の代わりにgetMap()が使用されていたため、古くなっているようです。 –

+0

マップが準備完了するまで呼び出しをブロックするので、getMapと連動します。これは非同期バージョンです。いくつかの低品質の "チュートリアル"を使用してInsteedはアンドロイドの地図を使用する方法についてGoogleの公式ドキュメントをチェックしてみませんか? – Antoniossss

関連する問題