2017.8.12
Androidアプリ開発日誌#3【Google Map#2-都庁にピンを立てましょう!-】
なんか地図が表示できましたし、次は我らが東京都庁にでもピンを立ててみましょう(笑)
リファレンスを見る限り、ピンを立てるだけなら割と簡単にできそーな風に書かれてますが
なんか分かりませんが動きません(笑)(笑)
まぁプログラミングあるあるですね。
サンプルが何故か動かないという。いつものやつです。
こーいうのはサンプルのバージョンが古いとか、そもそも使うための設定がうまくいってないとか、まぁどっかしらに原因はあるものです。しかし仕方がないのでこのまま続ける他ありません。(笑)
とりあえず
なんか分からんが動いたので、ソースコードの解読をしたいなーと思うのです。
ちなみに、ここに至ったまでの流れとして・・・・・・
1.普通にMapsActivityを新規作成し、シドニーにピンが刺さってるところまでは表示できた。(初期状態)
2.ファイルをkotlinに変換し、テキトーに他サイトからコードを引っ張ってきて都庁にマーカーを移そうにもうまくいかない。ピンが移らないどころか実行時クラッシュする始末。ほんと???って感じ。
3.試しても動かないから、新しくプロジェクトを作り、MapsActivityしかないプロジェクトを作ったが、これも動かない。絶望。
4.昨日ぐらいからずっとこんな感じで悶々として時間を溶かす。
5.今度はActivity単体で作り直してみることにして、クラッシュから復帰できなくなったファイルを消し、新たに"New Kotlin Activity"からMapsActivityを作る。
6.なんか知らんけど動いた。(???????????????)
ついでなんで、ソースコードもぺたぺたしましょう。
class MapsActivity : FragmentActivity(), OnMapReadyCallback {
private var mMap: GoogleMap? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps2)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
// Add a marker in Sydney and move the camera
val sydney = LatLng(35.689605, 139.692316)
mMap!!.addMarker(MarkerOptions().position(sydney).title("都庁。我々横浜県民には無縁の場所である。"))
mMap!!.moveCamera(CameraUpdateFactory.newLatLng(sydney))
}
}
ほぼデフォルトから無編集です。変えたところはsydneyの座標を東京都庁のものに差し替えたのと、説明文を変えたとこぐらいですね。
なんで今まで動かなかったのかがよく分かりませんが、とりあえずこう書けば動きはするんだというメモとして残しておきます。
Kotlinファイルへの変換の時に上手くいってないところがあったのかなぁーみたいなとこがあるんですが、とりあえず動くサンプルさえ手に入ればそこから構造を覚えることができるので大きな前進です。動かないソースコード見てもしょーがないですからねホント・・・・・・。
怪しいところというと、mMapのあとの
!!.ですかね。これなんなんだろう。
!単体だと
null入ってんじゃねぇか死ね!!!!って意味になると思うんですけど、2つ続いた場合の処理に関してはググってもなかなかヒットしませんね。どっかで見たよーな気もしなくもないのですが・・・・・・。公式リファレンスとか見たほうがいいんですかね。
英語あんま読みたくないんだよなぁ(笑)
一応。Railsでは
nullであればfalseに置き換えて返却するみたいなこと書かれてるんで、それがクサいなぁーとか思ってますけどね。
んじゃぁ、簡単に分析でもしてみましょーか。
setContentView(R.layout.activity_maps2)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
|
まずこのへんですね。
SupportMapFragment型のなんかを宣言してますね。(理解してない)
mapというidのマップが置かれているアクティビティっぽいので、これでマップとmapFragmentが結びつくんですかね。
その後の
getMapAsyncで、この後に宣言されている
onMapReadyが呼び出されるのかなって感じはします。
mMap = googleMap
// Add a marker in Sydney and move the camera
val sydney = LatLng(35.689605, 139.692316)
mMap!!.addMarker(MarkerOptions().position(sydney).title("都庁。我々横浜県民には無縁の場所である。"))
mMap!!.moveCamera(CameraUpdateFactory.newLatLng(sydney))
|
こっちは割とわかりやすいですね。
まず、座標の設定は基本的にLatLngなるクラスのインスタンスでするみたいですね。
クラスなのでなんかインポートしてます。この辺は
この前ちらっと触れた自動インポートを設定してれば特に気にしなくても勝手になんか入ります。(笑)
そして、googlemapに紐付いているらしいmMapという変数にaddMarkerしてますね。そのまんまです。
ここでMarkerのオプションとしていろいろ設定できるニオイがしますね。
そして最後に、このsydney(都庁)が中心となるような位置にカメラを移動して完成、って感じです。
ちなみになんか気になったので、このビックリマークを剥がせないかって思って消してみるとコンパイルエラーが出ました(笑)
エラーメッセージは「同じ行に命令2つ書くんだったらセミコロン使えやボケ
お前コロン好きなんだろ!?」みたいな旨のメッセージなので、なんの参考にもなりませんでした(笑)
まぁとりあえずブラックボックスはブラックボックスのまま置いときましょう。そのうち分かることもあるものです。今は動けばいいのだ。(笑)
次はこれを拡張していく動きになるのですが、今度はマーカーを複数置くことを初めてみましょうかね。そしてそれぞれに独自のメッセージボックスを持たせることができれば
実は一番難しそうな部分が終了します(笑)
僕が作ろうとしてるシステムの答えとしてこの連載で触れてしまうべきかどうかはまだまだ悩ましいところですが、まぁ徐々にその全容を明らかにしたいなーとか思っていたりはします。
が、個人的にこのシステムは「当たればいいなー」的な感じで開発しているのにすぎず、本命はその次及びそのまた次って感じですね。もちろん遊びで作ってるわけじゃないんですけど、どうも利益の回収率の面から見てもちょっと微妙かなーみたいなところはあるんですよね。グローバル展開が前提ってところもちょっとコスパ悪いです。
が、こちらを先に持ってきた方がリスク低いかなって感じはしたのでまずはこちらを開発しようと思ったわけです。
まぁこれを見てる人にはなんのこっちゃって感じですけど、そのうちきっとわかると思うので伏線として書いておきます(笑)僕は現時点では三段階のフェーズに分かれる事業をやろうとしておるのだ・・・・・・。