CameraUpdateFactory.newLatLngBoundsを含むmoveCameraがクラッシュする


96

新しいAndroid Google Maps APIを利用しています

MapFragmentを含むアクティビティを作成します。アクティビティonResumeでは、マーカーをGoogleMapオブジェクトに設定し、すべてのマーカーを含む地図の境界ボックスを定義します。

これは次の疑似コードを使用しています:

LatLngBounds.Builder builder = new LatLngBounds.Builder();
while(data) {
   LatLng latlng = getPosition();
   builder.include(latlng);
}
CameraUpdate cameraUpdate = CameraUpdateFactory
   .newLatLngBounds(builder.build(), 10);
map.moveCamera(cameraUpdate);

を呼び出すmap.moveCamera()と、次のスタックでアプリケーションがクラッシュします。

Caused by: java.lang.IllegalStateException: 
    Map size should not be 0. Most likely, layout has not yet 

    at maps.am.r.b(Unknown Source)
    at maps.y.q.a(Unknown Source)
    at maps.y.au.a(Unknown Source)
    at maps.y.ae.moveCamera(Unknown Source)
    at com.google.android.gms.maps.internal.IGoogleMapDelegate$Stub
        .onTransact(IGoogleMapDelegate.java:83)
    at android.os.Binder.transact(Binder.java:310)
    at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a
        .moveCamera(Unknown Source)
    at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source)
    at ShowMapActivity.drawMapMarkers(ShowMapActivity.java:91)
    at ShowMapActivity.onResume(ShowMapActivity.java:58)
    at android.app.Instrumentation
        .callActivityOnResume(Instrumentation.java:1185)
    at android.app.Activity.performResume(Activity.java:5182)
    at android.app.ActivityThread
        .performResumeActivity(ActivityThread.java:2732)

newLatLngBounds()ファクトリーメソッドの代わりに私がメソッドを使用newLatLngZoom()する場合、同じトラップは発生しません。

あるonResumeGoogleマップのオブジェクト上にマーカーを描画するのに最適な場所または私はマーカーを描画し、どこか他のカメラの位置を設定すべきですか?

回答:


133

あなたは、単純な使用することができますnewLatLngBoundsの方法をOnCameraChangeListener。すべてが完璧に機能し、画面サイズを計算する必要はありません。このイベントは、(私が理解しているように)マップサイズの計算後に発生します。

例:

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);
    }
});

1
これは、マップがレイアウトされた後、setOnCameraChangeListenerが少なくとも1回は実行されることが保証されているため機能しますか?これは将来の証拠ですか?
Glenn Bech 2013

3
@SteelRatそれが私がソリューションの使用に反対する理由です。グーグルがいつこれを変更するのか、それがすべてのAndroidバージョンまたはデバイスでそのように機能するのかどうかはわかりません。
Glenn Bech 2013

1
@SteelRat同意しますが、アクティビティの存続期間中に複数回呼び出される可能性がありますか?私はこのケースでそれがうまくいくとしても、それは非常にエレガントな解決策ではないと主張しています。OnGlobalLayoutListener / Treelistenerは、これを行うためのより正しい方法だと思います。
Glenn Bech 2013

4
おそらくmap.moveCamera(CameraUpdateFactory.scrollBy(1、1));を追加します。上記のコードがトリックを作る後?
MY

3
setOnCameraChangeListenerは非推奨になりました
osrl 2016

56

これらの答えは問題ありませんが、私は別のアプローチ、より単純なアプローチを採用します。マップがレイアウトされた後にのみメソッドが機能する場合は、それを待つだけです。

map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
    @Override
    public void onMapLoaded() {
        map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 30));
    }
});

1
多くの実験の結果、この回答と上記のダニエレの組み合わせを実装する必要があることがわかりました。マップがまだ読み込まれていない場合や、レイアウトがまだ完了していない場合があります。両方が起こるまで、カメラを思い通りに動かすことができませんでした。
RobP 2014年

2
ドキュメントからのこのメソッドの警告:「接続の問題が原因で地図が読み込まれない場合またはユーザーが絶えず地図を操作しているために地図が継続的に変更され、読み込みが完了しない場合、このイベントは発生しません。」(私の強調)。
stkent

1
これは、正しい位置に移動する前に、マップタイルが誤った位置に読み込まれるのを待つため、必要以上に遅延します。
John Patterson

1
ほとんどの場合、発砲するのに3〜10秒かかりますが、これは受け入れられません。
Nima G

ここはカメラを動かす場所です。map.moveCameraではなくmap.animateCameraを使用することをお勧めします
Bharat Dodeja

51

わかりました。ここに記載されいるように、APIは事前レイアウトでは使用できません。

使用する正しいAPIは次のとおりです。

注:地図がレイアウトされた後にカメラを移動するために使用する場合は、CameraUpdateを生成するために、より単純なメソッドnewLatLngBounds(boundary、padding)のみを使用してください。レイアウト中に、APIはバウンディングボックスを正しく投影するために必要なマップの表示境界を計算します。比較すると、APIは渡された引数から表示境界を計算するため、マップがレイアウトされる前でも、より複雑なメソッドnewLatLngBounds(boundary、width、height、padding)によって返されるCameraUpdateをいつでも使用できます。

問題を解決するために、画面サイズを計算し、幅と高さを

public static CameraUpdate newLatLngBounds(
    LatLngBounds bounds, int width, int height, int padding)

これにより、境界ボックスの事前レイアウトを指定できるようになりました。


18
しかし、マップが画面全体を占めていない場合はどうなりますか?
theblang 2014

私の場合は、実際よりも大きい画面を想定していたため、実際に余りにも大きくならないようにパディングをより慎重に計算する必要がありました。より単純な理由。
rfay 2014年

2
画面サイズに基づいて計算する方法を教えてください。
ダニエルゴメスリコ

これはクラッシュしませんが、使用される幅と高さは純粋な推測に近く、描画される正確な領域は本当に予測できません。
ビンス

34

ソリューションはそれよりも簡単です...

// Pan to see all markers in view.
try {
    this.gmap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
} catch (IllegalStateException e) {
    // layout not yet initialized
    final View mapView = getFragmentManager()
       .findFragmentById(R.id.map).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() {
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                    mapView.getViewTreeObserver()
                        .removeGlobalOnLayoutListener(this);
                } else {
                    mapView.getViewTreeObserver()
                        .removeOnGlobalLayoutListener(this);
                }
                gmap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
            }
        });
    }
}

IllegalStateException代わりに、ビューのグローバルリスナーをキャッチして使用します。他の方法を使用して事前にバインドサイズを設定する(事前レイアウト)には、画面デバイスではなく、ビューのサイズを計算する必要があります。マップと全画面表示し、フラグメントを使用しない場合にのみ一致します。


今まで私はあなたの小さなスニペットを使用してきましたが、それでも失敗します...正解は最初のものです:-)
cesards

1
どのように/いつ失敗しますか?これで問題がなかった。最初の答えは、ハードコードされたサイズをフォールバックとして渡すだけです。「もう動作しない」のように「動作します」が、同じことはしていません。
Daniele Segato 2013年

@ andrea.spot単純に言った理由は覚えていません。その間、受け入れられたソリューションは編集されたと思います。現在受け入れられた解決策は、あなたのマップが常に真実ではない、すべての画面を、取ると仮定します。あなたがその場合に該当しない場合は、マップのサイズを知っているか、私の方法または類似の何かを使用する必要があります。
Daniele Segato 2015

Xingang Huangによる以下の回答も確認してください。少し追加されています。
Daniele Segato 2015

15

これは私の修正です。その場合、マップがロードされるまでお待ちください。

final int padding = getResources().getDimensionPixelSize(R.dimen.spacing);    

try {
    mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(pCameraBounds, padding));
} catch (IllegalStateException ise) {

    mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {

        @Override
        public void onMapLoaded() {
            mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(pCameraBounds, padding));
        }
    });
}

シンプルで効率的な1
SHID

14

マーカーの追加と削除はレイアウトの完了前に行うことができますが、カメラを移動することはできません(newLatLngBounds(boundary, padding)OPの回答に記載されている使用を除く)。

おそらく、最初のカメラ更新を実行するのに最適な場所はOnGlobalLayoutListenerGoogleのサンプルコードに示されているように、ワンショットを使用することです。たとえばsetUpMap()MarkerDemoActivity.javaの次の抜粋を参照してください。

// Pan to see all markers in view.
// Cannot zoom to bounds until the map has a size.
final View mapView = getSupportFragmentManager()
    .findFragmentById(R.id.map).getView();
if (mapView.getViewTreeObserver().isAlive()) {
    mapView.getViewTreeObserver().addOnGlobalLayoutListener(
    new OnGlobalLayoutListener() {
        @SuppressLint("NewApi") // We check which build version we are using.
        @Override
        public void onGlobalLayout() {
            LatLngBounds bounds = new LatLngBounds.Builder()
                    .include(PERTH)
                    .include(SYDNEY)
                    .include(ADELAIDE)
                    .include(BRISBANE)
                    .include(MELBOURNE)
                    .build();
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
              mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
              mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
            mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
        }
    });
}


向きを変更すると、このエラーが発生します。これもサンプルコードから見つかりましたが、うまくいきませんでした。それでも同じエラーが発生します。
osrl 2016

14

アプリのさまざまな場所で同じコードを使用する必要があったため、受け入れられた答えは私にとってはうまくいきませんでした。

カメラの変更を待つのではなく、マップサイズを指定するというLeeの提案に基づいて、簡単なソリューションを作成しました。これは、マップが画面のサイズである場合です。

// Gets screen size
int width = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels;
// Calls moveCamera passing screen size as parameters
map.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), width, height, 10));

それが他の誰かを助けることを願っています!


8

受け入れられた答えは、コメントで指摘されているように、少しハックです。それを実装した後IllegalStateException、分析で許容量を超えるログに気づきました。私が使用した解決策はOnMapLoadedCallbackCameraUpdateが実行されるを追加することです。コールバックがに追加されますGoogleMap。マップが完全に読み込まれた後、カメラの更新が実行されます。

これにより、カメラの更新を実行する前に、マップはズームアウト(0,0)ビューを一時的に表示します。これは、クラッシュを引き起こしたり、文書化されていない動作に依存したりするよりも許容できると思います。


5
 map.moveCamera(CameraUpdateFactory.newLatLngZoom(bounds.getCenter(),10));

これを使って私に働きました


これは地図を中央に配置するだけで、境界に合わせてズームを動的に調整しません。
Giovanni Di Gregorio

"LatLngBounds.Builder"を使用して、より多くのマッカーの境界を計算できます。
Ramesh Bhupathi 2015年

@RameshBhupathiですが、中心とズームのあるマップビューのままです。
Tima

4

非常にまれなケースですが、MapViewレイアウトは完了していますが、GoogleMapレイアウトは完了してViewTreeObserver.OnGlobalLayoutListenerいません。それ自体はクラッシュを停止できません。Google Play開発者サービスパッケージのバージョン5084032でクラッシュが発生しました。このまれなケースは、MapViewの可視性の動的な変更が原因である可能性があります。

この問題を解決するためGoogleMap.OnMapLoadedCallbackonGlobalLayout()

if (mapView.getViewTreeObserver().isAlive()) {
    mapView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        @SuppressWarnings("deprecation")
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
                mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
            try {
                map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 5));
            } catch (IllegalStateException e) {
                map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
                    @Override
                    public void onMapLoaded() {
                        Log.d(LOG_TAG, "move map camera OnMapLoadedCallback");
                        map.moveCamera(CameraUpdateFactory
                            .newLatLngBounds(bounds, 5));
                    }
                });
            }
        }
    });
}

興味深い:ローカル変数にリファクタリングmapView.getViewTreeObserver()すると、次のエラーが発生します:「IllegalStateException:このViewTreeObserverは生きていません。getViewTreeObserver()をもう一度呼び出してください」。やってみましたか?
JJD 2014年

。mapView.getViewTreeObserverは()のisAlive()はfalseことが起こる場合には、私はmap.setOnMapLoadedCallback()のためのより多くのフォールバック1を入れたい
southerton

4

最近のバージョンのGoogle Maps SDK(9.6以降)で機能し、onCameraIdleListenerに基づく別のアプローチを使用しました。これまで見てきたように、それonCameraIdleは常にの後に呼び出されるコールバックメソッドonMapReadyです。だから私のアプローチは次のコードのようになります(それがに置かれていることを考えるとActivity):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // set content view and call getMapAsync() on MapFragment
}

@Override
public void onMapReady(GoogleMap googleMap) {
    map = googleMap;
    map.setOnCameraIdleListener(this);
    // other initialization stuff
}

@Override
public void onCameraIdle() {
    /* 
       Here camera is ready and you can operate with it. 
       you can use 2 approaches here:

      1. Update the map with data you need to display and then set
         map.setOnCameraIdleListener(null) to ensure that further events
         will not call unnecessary callback again.

      2. Use local boolean variable which indicates that content on map
         should be updated
    */
}

4

2つのコールバックを組み合わせる方法を作成しました:onMapReadyとonGlobalLayoutは、両方のイベントがトリガーされた場合にのみ発行される1つの監視対象に結合します。

https://gist.github.com/abhaysood/e275b3d0937f297980d14b439a8e0d4a


1
これは実際にこれを解決する最もクリーンな方法です。私はこれを長い間行っており、1日あたり1,000人のユーザーのアプリであっても、分析でエラーが返されません。+1
Skyle

2

はい、同じ問題に直面しています。SupportmapFragment、ABS、ナビゲーションドロワーにフラグメントがあります。私がしたことは:

public void resetCamera() {

    LatLngBounds.Builder builderOfBounds = new LatLngBounds.Builder();
    // Set boundaries ...
    LatLngBounds bounds = builderOfBounds.build();
    CameraUpdate cu;
    try{
        cu = CameraUpdateFactory.newLatLngBounds(bounds,10);
        // This line will cause the exception first times 
        // when map is still not "inflated"
        map.animateCamera(cu); 
        System.out.println("Set with padding");
    } catch(IllegalStateException e) {
        e.printStackTrace();
        cu = CameraUpdateFactory.newLatLngBounds(bounds,400,400,0);
        map.animateCamera(cu);
        System.out.println("Set with wh");
    }

    //do the rest...
}

そして、ところで、私が呼んでいるresetCamera()からonCreateView膨らませると、前に戻った後。
これが行うことは、最初に例外をキャッチすることです(つまり、マップが「サイズを取得する」と言いながら...)。次に、カメラをリセットする必要がある場合、マップはすでにサイズを持ち、パディングによってそれを行います。

問題はドキュメントで説明されています:

マップがレイアウトされるまで、このカメラアップデートでカメラを変更しないでください(このメソッドが適切な境界ボックスとズームレベルを正しく決定するには、マップにサイズが必要です)。それ以外の場合はIllegalStateExceptionスローされます。マップが利用可能である(つまりgetMap()、null以外のオブジェクトを返す)には不十分です。マップを含むビューも、その寸法が決定されるようにレイアウトされている必要があります。これが発生したことを確認できない場合は、newLatLngBounds(LatLngBounds, int, int, int)代わりにを使用して、手動でマップの寸法を入力してください。

私はそれはかなりまともな解決策だと思います。それが誰かを助けることを願っています。


1
レイアウトが完全に読み込まれたときにリッスンするリスナーはありますか??
Sagar Nayak 2016年

で発生した例外であるnewLatLngBounds()かにanimateCamera()、または両方には?キャッチブランチは新しい例外につながりませんか?
CoolMind

1

ユーザーとの対話が始まるのを待つ必要がある場合OnMapLoadedCallbackは、前の回答で説明されているように使用してください。ただし、マップのデフォルトの場所を指定するだけでよい場合は、それらの回答で概説されているソリューションは必要ありません。どちらMapFragmentMapView受け入れることができGoogleMapOptions、デフォルトの場所はすべての権利を提供することができます開始時に。唯一のトリックは、システムがオプションなしでそれらを呼び出すため、それらをレイアウトに直接含めることではなく、動的に初期化することです。

これをレイアウトで使用します。

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

そしてあなたのフラグメントを置き換えますonCreateView()

GoogleMapOptions options = new GoogleMapOptions();
options.camera(new CameraPosition.Builder().target(location).zoom(15).build());
// other options calls if required

SupportMapFragment fragment = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);
if (fragment == null) {
  FragmentTransaction transaction = getFragmentManager().beginTransaction();
  fragment = SupportMapFragment.newInstance(options);
  transaction.replace(R.id.map, fragment).commit();
  getFragmentManager().executePendingTransactions();
}
if (fragment != null)
  GoogleMap map = fragment.getMap();

開始が高速であることに加えて、最初に表示される世界地図はなく、次にカメラが動きます。地図は指定された場所から直接始まります。


0

別のアプローチは次のようになります(最上位のビューがという名前のFrameLayoutであると仮定しますが、rootContainerどのタイプや名前でも常に最上位のコンテナーを選択する限り、それは機能します)。

((FrameLayout)findViewById(R.id.rootContainer)).getViewTreeObserver()
    .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            layoutDone = true;
        }
    });

場合にのみ動作するようにカメラの機能を変更するlayoutDoneISはtrue、余分な機能を追加したりするロジックを配線することなく、すべてのあなたの問題を解決するlayoutListenerハンドラ。


0

私はこれが機能し、他のソリューションよりも簡単であることがわかりました:

private void moveMapToBounds(final CameraUpdate update) {
    try {
        if (movedMap) {
            // Move map smoothly from the current position.
            map.animateCamera(update);
        } else {
            // Move the map immediately to the starting position.
            map.moveCamera(update);
            movedMap = true;
        }
    } catch (IllegalStateException e) {
        // Map may not be laid out yet.
        getWindow().getDecorView().post(new Runnable() {
            @Override
            public void run() {
                moveMapToBounds(update);
            }
        });
    }
}

レイアウトが実行された後、これは呼び出しを再試行します。おそらく無限ループを回避するための安全性を含めることができます。


0

なぜ次のようなものを使用しないのですか?

CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), padding);
try {
    map.moveCamera(cameraUpdate);
} catch (Exception e) {
    int width = getResources().getDisplayMetrics().widthPixels;
    int height = getResources().getDisplayMetrics().heightPixels;
    cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), width, height, padding);
    map.moveCamera(cameraUpdate);
}

なぜnewLatLngBounds(builder.build(), padding)try-catchの中にないのですか?この例外はで発生しmoveCamera()ますか?
CoolMind

0

Googleマップリポジトリには、活用できるヘルパークラスがあります。これは、レイアウトとマップの両方の準備ができるまで待機してから、GoogleMapでコールバックを通知します。

元のソースはここにあります:

https://github.com/googlemaps/android-samples/blob/7ee737b8fd6d39c77f8b3716ba948e1ce3730e61/ApiDemos/java/app/src/main/java/com/example/mapdemo/OnMapAndViewReadyListener.java

Kotlinの実装もあります。

https://github.com/googlemaps/android-samples/blob/master/ApiDemos/kotlin/app/src/main/java/com/example/kotlindemos/OnMapAndViewReadyListener.kt

public class OnMapAndViewReadyListener implements OnGlobalLayoutListener, OnMapReadyCallback {

/** A listener that needs to wait for both the GoogleMap and the View to be initialized. */
public interface OnGlobalLayoutAndMapReadyListener {
    void onMapReady(GoogleMap googleMap);
}

private final SupportMapFragment mapFragment;
private final View mapView;
private final OnGlobalLayoutAndMapReadyListener devCallback;

private boolean isViewReady;
private boolean isMapReady;
private GoogleMap googleMap;

public OnMapAndViewReadyListener(
        SupportMapFragment mapFragment, OnGlobalLayoutAndMapReadyListener devCallback) {
    this.mapFragment = mapFragment;
    mapView = mapFragment.getView();
    this.devCallback = devCallback;
    isViewReady = false;
    isMapReady = false;
    googleMap = null;

    registerListeners();
}

private void registerListeners() {
    // View layout.
    if ((mapView.getWidth() != 0) && (mapView.getHeight() != 0)) {
        // View has already completed layout.
        isViewReady = true;
    } else {
        // Map has not undergone layout, register a View observer.
        mapView.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    // GoogleMap. Note if the GoogleMap is already ready it will still fire the callback later.
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    // NOTE: The GoogleMap API specifies the listener is removed just prior to invocation.
    this.googleMap = googleMap;
    isMapReady = true;
    fireCallbackIfReady();
}

@SuppressWarnings("deprecation")  // We use the new method when supported
@SuppressLint("NewApi")  // We check which build version we are using.
@Override
public void onGlobalLayout() {
    // Remove our listener.
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    } else {
        mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
    isViewReady = true;
    fireCallbackIfReady();
}

private void fireCallbackIfReady() {
    if (isViewReady && isMapReady) {
        devCallback.onMapReady(googleMap);
    }
}
}

0

で述べたように()は推奨されませんOnCameraChangeListenersetOnCameraChangeListener廃止されます。したがって、3つのmtehodのいずれかに置き換える必要があります。

  • GoogleMap.OnCameraMoveStartedListener
  • GoogleMap.OnCameraMoveListener
  • GoogleMap.OnCameraIdleListener

私の場合、私はOnCameraIdleListenerそれを使用し、内部でそれを削除しました。

googleMap.setOnCameraIdleListener {
    googleMap.setOnCameraIdleListener(null) // It removes the listener.
    googleMap.moveCamera(track)
    googleMap.cameraPosition
    clusterManager!!.cluster()
    // Add another listener to make ClusterManager correctly zoom clusters and markers.
    googleMap.setOnCameraIdleListener(clusterManager)
}

更新

googleMap.setOnCameraIdleListener地図が表示されたときに呼び出されなかったため、プロジェクトで削除しましたが、保持されましたgoogleMap.setOnCameraIdleListener(clusterManager)


お返事ありがとうございます。このような解決策はすでにわかっています。
Arslan Maqbool 2018

@ArslanMaqbool、ありがとう!私は現在処理中であり、バリエーションを共有していただければ感謝いたします。
CoolMind 2018

私の喜び@CoolMind
Arslan Maqbool

0

mMap.animateCameraを呼び出そうとして同じエラーが発生しました。以下に示すように、onMapReady関数でsetOnMapLoadedCallbackコールバックを呼び出すことで解決しました

public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

   // other codes go there

    mMap.setOnMapLoadedCallback(() -> {
            //Your code where exception occurs goes here...
            
        });
}

これは正常に動作するはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.