2013-01-22 13 views
7

新しいGoogle Maps APIのSuportMapFragmentを埋め込んでいるフラグメントに問題があります。私のフラグメントが作成されると、onResumeメソッドで始まるAsyncTaskのデータがフェッチされます。この間MapFragmentはオフスクリーンのままですが、代わりに進捗バーが表示されます。onGlobalLayout()の後にGoogleMap.animateCamera()がクラッシュするのはなぜですか?

AsyncTaskが完成すると、mapViewのonGlobalLayoutイベントで登録します。次に、フラグメントを表示します。その結果、マップビューが表示され、レイアウトされます。 onGlobalLayoutがトリガーされ、アニメーションが開始されます。

データ収集の操作を最適化してから、ほとんど瞬間的に完了するまで、これはかなり時間がかかりました。今では、アプリが起動するとクラッシュすることが多く、リリースよりも頻繁にデバッグされるため、私はここで私が認識していないレース状態に対処していると思うのです。

例外が読み:

地図のサイズは0ですが、ほとんどの場合、レイアウトはまだマップビューのために発生していないではありません。

洞察力があれば幸いです。参考のため

:これはクラッシュを引き起こすように見えるコードです:

// Hide status UI 
this.progressBar.setVisibility(View.INVISIBLE); 
this.statusTextView.setVisibility(View.INVISIBLE); 

// Update state 
this.uraDataDownloadFinished = true; 

// Schedule map translation to occur when layout is complete 
final View mapView = this.mapFragment.getView(); 
if (mapView.getViewTreeObserver().isAlive()) 
{ 
    mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
    { 
     @SuppressWarnings("deprecation") 
     @SuppressLint("NewApi") // We check which build version we are using. 
     @Override 
     public void onGlobalLayout() 
     { 
      Log.d(TAG, "onGlobalLayout()"); 
      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) 
      { 
       mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 
      else 
      { 
       mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 

      // here we crash 
      this.map.animateCamera(
        CameraUpdateFactory.newLatLngBounds(
          LatLngBounds.builder() 
           .include(topLeft) 
           .include(topRight) 
           .include(bottomLeft) 
           .include(bottomRight) 
           .build(), 
          0), 
        durationMs, 
        null); 
     } 
    }); 
} 

// Show map (which will eventually trigger onGlobalLayout) 
this.getFragmentManager().beginTransaction().show(this.mapFragment).commit(); 
this.mapFragment.getMap().setOnCameraChangeListener(this); 

どうもありがとう!

答えて

5

私はよく分かりませんが、AsyncTaskを使用していると、マップがレイアウトされる前にマップ境界を取得しようとしている可能性があります。

documentationが表示されますが、代わりにnewLatLngBounds(boundary, width, height, padding)を使用することをおすすめします。

+0

おかげで、。地図はレイアウトコンテナを完全に塗りつぶすので、代わりにその寸法を使用できます。しかし、私の質問は残っています。私は 'onGlobalLayout()'を待っているので、私はこの問題に遭遇するべきではありませんか? – Chris

+0

いいえ、私はそうは思わない、地図がレイアウトされるまで待たなければならない。 – jgonza73

+0

...またはマップ境界なしでCameraOptionsを編集する – jgonza73

3

は、このいずれかを試して、それが私の作品:作品

map.setOnCameraChangeListener(new OnCameraChangeListener() { 

    @Override 
    public void onCameraChange(CameraPosition arg0) { 
     // Move camera. 
     map.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 10)); 
     // Remove listener to prevent position reset on camera move. 
     map.setOnCameraChangeListener(null); 
    } 
}); 
関連する問題