プロフィール

Author:はるかわ しおん
なにか、新しいものを。
そして、楽しいものを。

FC2カウンター


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.

Google Maps Android API v2 をいじっていたところ、以下の例外が発生しました。



FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.maptest/com.example.maptest.MainActivity}: java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1971)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1996)
at android.app.ActivityThread.access$700(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1156)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4458)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.
at maps.au.i.b(Unknown Source)
at maps.aj.v.a(Unknown Source)
at maps.aj.r.a(Unknown Source)
at maps.aj.al.a(Unknown Source)
at bcn.onTransact(SourceFile:83)
at android.os.Binder.transact(Binder.java:297)
at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.moveCamera(Unknown Source)
at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source)
at com.example.maptest.MainActivity.onCreate(MainActivity.java:76)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1935)
... 11 more



複数の地点をいい感じのズームレベルで表示させるための処理を書いていた時でした。
どうも、以下の newLatLngBounds() のせいのようです。


GoogleMap map = <生成>;
LatLngBounds bounds = new LatLngBounds.Builder().include(new LatLng(35.360444, 138.727561))
.include(new LatLng(35.335722, 138.794563)).include(new LatLng(35.396018, 139.313088)).build();
map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));


onCreate() に書かれているのが原因かと思い onResume() に移しましたが変わりませんでした。
 →地図がよういできていないタイミングでは newLatLngBounds() が効かないのかと思いまして・・・


対策として、newLatLngBounds (LatLngBounds bounds, int width, int height, int padding) を使うことにしました。


GoogleMap map = <生成>;
LatLngBounds bounds = new LatLngBounds.Builder().include(new LatLng(35.360444, 138.727561))
.include(new LatLng(35.335722, 138.794563)).include(new LatLng(35.396018, 139.313088)).build();
map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50, 50, 50));


・・・うおっと、また例外。
今度は以下。



java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.maptest/com.example.maptest.MainActivity}: java.lang.IllegalStateException: View size is too small after padding
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1971)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1996)
at android.app.ActivityThread.access$700(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1156)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4458)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: View size is too small after padding
at maps.au.i.b(Unknown Source)
at maps.aj.t.a(Unknown Source)
at maps.aj.w.a(Unknown Source)
at maps.aj.r.a(Unknown Source)
at maps.aj.al.a(Unknown Source)
at bcn.onTransact(SourceFile:83)
at android.os.Binder.transact(Binder.java:297)
at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.moveCamera(Unknown Source)
at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source)
at com.example.maptest.MainActivity.onCreate(MainActivity.java:73)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1935)
... 11 more




結果としては、これで対処しました。


GoogleMap map = <生成>;
LatLngBounds bounds = new LatLngBounds.Builder().include(new LatLng(35.360444, 138.727561))
.include(new LatLng(35.335722, 138.794563)).include(new LatLng(35.396018, 139.313088)).build();
WindowManager windowmanager = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = windowmanager.getDefaultDisplay();
int width = disp.getWidth();
int height = disp.getHeight();
map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, width, (int) (height * 0.9), 50));


この例では、アクティビティの全体に地図を表示している状態なので、width にはディスプレイの幅、height にはディスプレイの高さ・・・からステータスバーのサイズを引かねばならないがめんどくさいのでざっくり高さの0.9倍・・・にしたものを指定しています。



コメント

コメントの投稿

   管理者にだけ表示を許可する
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。