7

この問題についてはたくさんの質問がありますが、ほとんどは専門的すぎて私の質問に答えることができません。

私はGoogleMapそのカメラを特定の境界に合わせるように言うものを持っています。おそらくそれほど驚くことではありませんが、エラーが発生します。

java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.

それでは、この問題を任意のに抽象化しましょうView

この「レイアウト」イベントは実際にいつ行われますか?たとえば、アクティビティライフサイクルonMeasure()には表示されません。レイアウトが必要なメソッドを呼び出すのはいつ安全ですか?

4

4 に答える 4

16

ドキュメントにあるように、これを使用する必要があります

mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 
                    this.getResources().getDisplayMetrics().widthPixels, 
                    this.getResources().getDisplayMetrics().heightPixels, 
                    50));

これがアクティビティである場合、代わりに

mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 
                    50));

これは私のために働きます。

ドキュメント

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

于 2013-04-25T09:52:43.170 に答える
9

更新されたMapsAPIでこの特定の問題を解決するには、次を使用する必要があります

map.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 50));

その他のビュー、および古いMaps APIについてはViewTreeObserver.OnGlobalLayoutListener、Simonの回答のように使用してください。

View.post()メッセージキューに何かを追加するために使用することもできますViewが、レイアウトが最後に行われることが保証されているかどうかはわかりません(そうではないと言う人もいますが、Groupon + Googleでさえ間違っています)。

マップフラグメントの場合:

MapFragment.getView().post(new Runnable(){
    run() {
       ...Use the layout params...
    }
}
于 2013-01-20T20:47:57.973 に答える
2

UIが表示された後に何かをするという意味だと思います。

グローバルレイアウトリスナーを使用することは、私にとって常にうまく機能してきました。また、レイアウトが変更された場合、たとえば、何かがView.GONEに設定されている場合、または子ビューが追加/削除された場合に、物事を再測定できるという利点もあります。

public void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);

     // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is
     LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.main, null); 

     // set a global layout listener which will be called when the layout pass is completed and the view is drawn
     mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
     new ViewTreeObserver.OnGlobalLayoutListener() {
          public void onGlobalLayout() {
               // at this point, the UI is fully displayed
          }
     }
 );

 setContentView(mainLayout);

http://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener.html

于 2013-01-20T20:13:59.867 に答える
1

onWindowFocusChanged(boolean)を使用します。アクティビティのウィンドウにフォーカスが合っているかどうかを確認してください

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);

    if( hasFocus )
    {
        // Ask for any view size here
    }
}
于 2013-01-20T20:20:57.913 に答える