MapViewをタップしたらヌルポ。ヒント:(ItemizedOverlay.java:617)
ログはこんな感じ。
java.lang.NullPointerException at com.google.android.maps.ItemizedOverlay.getItemsAtLocation(ItemizedOverlay.java:617) at com.google.android.maps.ItemizedOverlay.getItemAtLocation(ItemizedOverlay.java:586) at com.google.android.maps.ItemizedOverlay.handleMotionEvent(ItemizedOverlay.java:498) at com.google.android.maps.ItemizedOverlay.onTouchEvent(ItemizedOverlay.java:572) at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63) at com.google.android.maps.MapView.onTouchEvent(MapView.java:679)
なかなか原因が追いにくいけど、これは中身の無いItemizedOverlay(もしくはこれを継承したObject)がMapViewにセットされているときに発生するもよう。
MapViewにセットされたオブジェクトをチェックしてみてね。
爆速AndroidエミュレータがついにMacOSX10.8.2でも使えるようになった!!
Androidの爆速エミュレータ環境を構築しようとして挫けたマカーたちへ朗報
超絶待った。
ついにFIX版がでました!
http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager?page=4
ここでhotfix版をDLしてインスコするだけで、あとは【番外編】Androidの爆速エミュレータ環境を構築する記載のやり方と同じ。
ただ、GCM(通知のやつ)とかgoogle map使いたい場合はこれだけじゃダメなんだよね。google map APIが入っているイメージがないとgoogle APIは使えない。で、探したらgoogle mapのAPIのみ含んだイメージを作った人がいました。
http://www.seal.io/2012/09/android-x86-images-with-google-sdk-maps.html
※自己責任で使ってね。
これをDLして解答してでてきたiniファイルの中身のユーザー部分を自分の環境に合わせて、指定の場所にコピーするだけ。
いやあ、確かに早いわ。エミュレータ自体の起動も早いし、アプリの再インストールも早いし、もちろんエミュレータ上でのアプリの動きも早い。肌感で10倍(適当)くらい早い。
これは使わない手はないっすよ!
これで、起動のたびにtwitterに意識持ってかれてそのまま帰ってこれなくなっちゃうこともなくなりますね!あれは等価交換なんてもんじゃないですからね!
あ、あとGPUサポートをONにすると画面がひっくりかえったり鏡写しになったりするからOFFにしたほうがいいですよ。
インテント間でオブジェクトを渡す方法
putExtra()にはプリミティブやString等のI/FはあるけどObjectのI/Fがない。
で、今回ぼくはどうしてもLocation型のオブジェクトが渡したくなったので、どうにか渡せないか調べてみると、ざっくり
- シリアライズする
- Parcelを使う
の2通りの方法が出てきた。
シリアライズは主にプロセス間での受け渡しにおける安全性や、パフォーマンスに難点があるため、もともとこういう時のために用意されたI/FであるParcelを使うのが好ましいとのこと。
参考:
http://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents
http://d.hatena.ne.jp/language_and_engineering/20120313/p1
http://d.hatena.ne.jp/kuwalab/20110207/p1
で、上記のリンクで充分といえば充分なんだけど、実際に動いた実装はこちら。
LocationParcelable.java
public class LocationParcelable implements Parcelable { private static final String TAG = LocationParcelable.class.getSimpleName(); public Location mLocation; public LocationParcelable() { } public LocationParcelable(Location location) { this.mLocation = location; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeValue(mLocation); } public static final Creator<LocationParcelable> CREATOR = new Creator<LocationParcelable>() { @Override public LocationParcelable createFromParcel(Parcel parcel) { final LocationParcelable l = new LocationParcelable(); l.mLocation = (Location) parcel.readValue(Location.class.getClassLoader()); return l; } @Override public LocationParcelable[] newArray(int i) { return new LocationParcelable[i]; } }; }
Locationオブジェクトを渡す側のActivity
LocationParcelable parcelable = new LocationParcelable(location); intent.putExtra("location", parcelable);
Locationオブジェクト受け取り側のActivity
LocationParcelable parcelable = (LocationParcelable)intent.getExtras().get("location");
Location location = parcelable.mLocation;
いやっほい。