7

新しい Google Maps API からの SuportMapFragment を埋め込む Fragment に問題があります。私のフラグメントが作成されるとAsyncTask、メソッドの最初にいくつかのデータがフェッチされますonResume。これが発生している間、MapFragment は画面外に残り、代わりにプログレス バーが表示されます。

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

AsyncTaskこれは、データ収集の操作を最適化してほぼ瞬時に完了するまで、かなり長い間うまくいきました。現在、アプリは起動時にクラッシュすることが多く、デバッグよりもリリースでより頻繁にクラッシュします。

例外は次のとおりです。

マップ サイズは 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);

どうもありがとう!

4

2 に答える 2

5

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

ドキュメントを参照してくださいnewLatLngBounds(boundary, width, height, padding)。代わりに使用することをお勧めします。

于 2013-01-25T13:14:55.870 に答える
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);
    }
});
于 2013-04-27T03:37:00.417 に答える