6

私はSupportMapFragmentからマップを取得しようとしていますが、nullを返します。フラグメントがまだ完全に表示されておらず、したがってマップが存在しないので、私が読んだことからそうである可能性があります。私はexecutePendingTransactions()を使用して修正しようとしましたが、これまでのところ成功しませんでした。mapFragment.getMap()がnullを返します

これを修正する方法はありますか?

ここ

コード

private GoogleMap map; 
private SupportMapFragment mapFragment; 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    //... 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.screen_mission2); 
    GoogleMapOptions mapOptions = new GoogleMapOptions(); 

    mapOptions.mapType(GoogleMap.MAP_TYPE_NORMAL) 
     .compassEnabled(true) 
     .rotateGesturesEnabled(false) 
     .tiltGesturesEnabled(false); 

    android.support.v4.app.FragmentManager myFragmentManager = getSupportFragmentManager(); 
    android.support.v4.app.FragmentManager.enableDebugLogging(true); 
    mapFragment = SupportMapFragment.newInstance(mapOptions); 
    FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.mapFragment, mapFragment); 
    fragmentTransaction.commit(); 
    myFragmentManager.executePendingTransactions(); 

    if(mapFragment == null) Base.log("mapFragment==null"); 
    if(map==null){ 
     map = mapFragment.getMap(); 
     Base.log("map should have been initialized"); 
     if(map==null) Base.log("map still null"); 
    } 
} 

とレイアウトファイルです。それは私がするので、これは可能性が読んだものから、次のログ

V/FragmentManager(24224): add: SupportMapFragment{4078c4b8 id=0x7f06003d} 
V/FragmentManager(24224): Allocated fragment index SupportMapFragment{4078c4b8 #1 id=0x7f06003d} 
V/FragmentManager(24224): moveto CREATED: SupportMapFragment{4078c4b8 #1 id=0x7f06003d} 
D/EMR  (24224): map should have been initialized 
D/EMR  (24224): map still null 
+0

に述べたようにフラグメントを操作するためにそれを使うのか? – yugidroid

+0

はい私はそれを宣言しました(コード部分を編集しました、上記参照) – cos4

+0

初期化されていますか?そうでなければ、何もない、すなわち「ヌル」と同じになる。 – yugidroid

答えて

1

を返し

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

フラグメントがまだ完全に表示されていないため、マップは存在しません。

正しい。

どのように修正するのですか?

実際にsetContentView()を呼び出してレイアウトファイルを使用して、FragmentTransactionのすべてを取り除きます。その後、既に作成したSupportMapFragmentを取得し、それを使用することができます。

setContentView(R.layout.activity_main); 

SupportMapFragment mapFrag=(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment); 
+0

ありがとうございました。私はそれについて考えましたが、GoogleMapOptionsで指定されたオプションを自分のコードで次にxmlファイルに設定するか、後で設定することはできますか? – cos4

+0

@ cos4:EclipseにはいくつかのEclipse/ADTバグのために問題を報告している人もいますが、XMLには同等のものがあります。それがうまくいかない場合は、XMLの 'SupportMapFragment'を取り除いて' FrameLayout'に置き換えて、既存の 'FragmentTransaction'(フラグメントを' FrameLayout'に流し込みます)を貼りますが、 (例えば、 'SupportMapFragment'のサブクラスを作成し、あなたのコードを' onActivityCreated() 'に入れてください)。 – CommonsWare

+0

XMLのマップのオプション設定に関する文書はありますか?何も見つけられませんでした...もしそうでなければ、SupportMapFragmentをサブクラス化しなければならないとしたら、onActivityCreated()からインテントを送り、それを私の現在のアクティビティからキャッチできますか? – cos4

14

onStart()またはonResume()にごGoogleMapを参照するすべてのコードを移動してみてください。マップフラグメント内のマップは、フラグメントがonCreateViewlink)を通過するまでインスタンス化されません。親アクティビティがonCreate()を通過した後に発生します。また、nullGoogleMapを確認する必要があります.Google Playサービスがインストールされていない場合や、他の理由で地図が利用できない場合はnullとなります。

+0

これははるかに簡単な解決策であるようです、ありがとう! –

+0

「なぜですか?」 「何?」と同様に。 –

1
あなたは OnMapReadyCallbackを実装する必要が

、そのpublic void onMapReady(GoogleMap map)を定義し、ここでは、 `mapFragment`変数を宣言したGoogle API

関連する問題