dogwood008の開発メモ!

最近のマイブームは機械学習, Ruby on Rails。中でも機械学習を使った金融商品の自動取引に興味があります。

Jetpack を使って、ビューモデルに沿った Android アプリを Kotlin で作成(2時間)

TL; DR

f:id:dogwood008:20180522021243p:plain:w250

  • Jetpack はアーキテクチャやUIその他色々の面倒を見てくれるすごいやつ
    • 自動でビューモデルのアーキテクチャでスケルトンを作ってくれる
  • 公式のページの導入手順に沿うと、ライブラリのインポートに失敗してビルドが正常完了しない(2018/05/22現在)
  • 動くサンプルはこちら 三 ( ◠‿◠ )☛ dogwood008/calc

Jetpack とは?

Google I/O 2018 で新たに発表された、ツールとライブラリ。以下の4つで構成される。

ファウンデーション、アーキテクチャ、ビヘイビア、UI
Jetpackで使用できるもの

  • ファウンデーション
    • AppCompat (後方互換性サポート)
    • Multidex (メソッド数上限開放)
    • テストフレームワーク 等
  • アーキテクチャ
    • データバインディング
    • ナビゲーション
    • ビューモデル 等
  • ビヘイビア
    • 通知
    • パーミッション
    • 共有 等
  • UI
    • アニメーション&トランジション
    • 絵文字
    • レイアウト

developer.android.com

Jetpack があると何が嬉しいの?

「Androidアプリ作りたいけど、アーキテクチャがいっぱいあってよくわからん」という人におすすめ。公式から提示された Jetpack により、これに乗っかっておけばなんとかなるという道が示された。

他にも上に挙げたようなもののうち、欲しいものだけつまんで導入することもできるので、車輪の再発明やボイラープレート(テンプレ)を引っ張り出してくる手間が省ける&(自分で書かなくてすむので)保守しやすくなるといったメリットがある。

Jetpackの導入

まずは Android Studio 3.2 が必要。でもまだ正式版は出ていないので Check for Update では振ってこない。ので直接zipをDLして展開する。

developer.android.com

プロジェクトをいつも通り新規作成する。

f:id:dogwood008:20180522004514p:plain

いつもの通り進めていくと、見慣れないやつ Activity & Fragment + ViewModel がいる。これを選択して次へ。

f:id:dogwood008:20180522004546p:plain

そうすると、アクティビティとフラグメントの名前に加え、ビューモデルの名前を決める画面が表示される。特に指定がなければデフォルトのままで完了。

f:id:dogwood008:20180522004733p:plain

Jetpack を使った実装

ビューモデルを実装していく。デフォルトのままだと、(Kotlinサポートにチェックを入れていれば) MainViewModel.kt でビューモデルのクラスが定義されている。下記を入力して実装する。

MainViewModel.kt

import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.arch.lifecycle.ViewModel

class MainViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String>
        get() = _data

    init {
        _data.value = "Hello, Jetpack!"
    }
}

続いて、実行に必要なライブラリをインポートする。

この手順では下記を変更せず書くことをおすすめします。もし原著の手順に従うとビルドに失敗するので注意!

build.gradle

// LiveData + ViewModel
def archLifecycleVersion = '1.1.1'
implementation "android.arch.lifecycle:extensions:$archLifecycleVersion"

// Navigation
def navigationVersion = '1.0.0-alpha01'
implementation "android.arch.navigation:navigation-fragment:$navigationVersion"
implementation "android.arch.navigation:navigation-ui:$navigationVersion"

最後に MainFragment.kt でビューモデルから取得した値を TextView に代入する。

MainFragment.kt (抜粋)

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    val text = viewModel.data.value
    message.text = text
}

これでおしまい。あとはビルドしたら Hello, Jetpack! が表示される。

f:id:dogwood008:20180522014015p:plain

今回のリポジトリはここに置いておきます。

github.com (電卓を作りたかったけど、2時間で記事書きながらじゃちょっと無理だった)

感想

正直アーキテクチャなんて好き好みあるし、どれが自分に・チームに最適かはわかんないよな~という人向けに、 「Jetpackを使ったら自動的にビューモデルである程度用意してくれる」というのが自分は好き。 Rails と比べるとやや物足りない感もあるが、「ディレクトリに意味があって、名前を勝手に変えると破滅して、……」というよりは初めてでもとっつきやすいので、その点を加味するとこれくらいで良いのかも。

もし記事中に誤りがあれば、 @dogwood008 までご連絡いただけると幸いです 🙇

参考

developer.android.com

180511 トレンドニュース

Googleが機械学習専用の第3世代プロセッサ「TPU3.0」を発表、冷却が追いつかず液冷システムまで導入する事態に - GIGAZINE

すごい gigazine.net

所有していたドメインが知らない間に海賊版サイトのものになっていたという驚きの報告、その原因とは? - GIGAZINE

これは不要になったAレコードを消し忘れてたというだけの話だった どんな恐ろしいハッキングがあったのかと思ったら、単なる 人的ミスだった 人的ミスも怖いけどね gigazine.net

Excelに追加されたJavaScriptカスタム関数機能を悪用してさっそく仮想通貨マイニングスクリプトが埋め込まれる - GIGAZINE

外部通信の確認ダイアログも出るみたいだし、即ヤバイというものではなさそう。こういうこと考える人がいるってことは世界って(善悪は別として)賢い人が沢山いるなあと思う gigazine.net

180510 トレンドニュース

Google、スマートフォン含むWebブラウザでリアルタイムに人間の姿勢推定を可能にする機械学習モデルPoseNet:TensorFlow.jsバーション発表 | Seamless

これもすごいなー shiropen.com

スマートフォンのみで全身の3Dモーションキャプチャが可能なAI駆動システム「RADiCAL」。スーツやセンサ等は不要。iOSアプリ無料リリース | Seamless

これすごいなー shiropen.com

180425 トレンドニュース

AWS、「Ethereum」や「Hyperledger Fabric」に対応した「AWS Blockchain Templates」を提供開始:コンテナとしてデプロイできる - @IT

何ができるかいまいちピンと来ないけど、例えばEthereumをテンプレートにして自分のブロックチェーンネットワークをインフラ構成込みで作れるって感じかな? www.atmarkit.co.jp