【Androidひとり開発】～ガラパゴス実装に陥らないための参考資料～

～この記事は、[ひとり開発 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/solo-developer)の提供でお送りしています～
前回の5日目は @mikkame さんの [Githubの日本語で書かれてるっぽいIssueを検索するサイトつくった](https://qiita.com/mikkame/items/33d65868195ae9aecdd3)でした。5日目なのにmikkameさんでした。（絶対これが言いたくて・・・）
OSS活動の入り口に、言語ハードルから下げていくのは全く正しい＆なかなか思いきれなかった切り口ですね。ありがたいサービスです。

## Androidアプリ、作ってますか
作ってますか。（エコー）
開発手法の進化、ヤバいですよね。
Androidx、ついていけてますか。
`findViewById`、まだ使ってますか。
根絶する方法、調べましたよね。

「ググったらなんか出来たな」って、なりますよね。
「けどコレでええんか？」とも、なりますよね。

そこからの質問先、困りますよね。
インターネットの記事、古いですよね。

こんなとき、ひとり開発、つらくなりますよね。

```
僕は　ついてゆけるだろうか
質問先のいないJetpackのスピードに
```
Jetpackの進化、名前の通り加速しすぎやんけってなガハハ！[^1]
[^1]: Android Jetpackが加速するものはそれを使う開発者の生産スピードです

## この記事でしゃべること
「道に迷ったらGoogle Codelabsを見てくれ」
「特にAndroidビギナー各位は**[android-kotlin-fundamentals](https://codelabs.developers.google.com/android-kotlin-fundamentals/)**を見てくれ」

以上です。本当に以上です。あとは好き勝手喋ります。いち早く学びたい方はこの記事よりもリンク先を読んでください。
読みすすめる方は**[このあたり](#android-kotlin-fundamentals-course)**からどうぞ。**それより前は筆が乗りすぎただけの導入です。**

## Google Codelabs
そういうわけで、Androidをやっている皆々様におかれましては、
**「いうてGoogle信じたら問題ないやろ」**というアンサーに異論はないものと思います。無いよね？

なので[Android Developers](https://developer.android.com/)を見ます。公式ですからね。大変に妥当。
ですがしかし、我々よわよわ開発者からすると大抵実装例が物足りません。

クラスのリファレンスあたりはメソッド名なんかから意味を察せると問題解決に至ったりしますが、
「組み立て方」のようなものを知りたいとなると白旗です。そうして安易な外部記事を参照してしまいます。

そう、組み立て方。実装例です。サンプルプログラムがほしい。欲を言えばチュートリアル形式でほしい。
その上で重要な部分には解説をつけて教えてほしい。自分で手を動かす要素があると殊更嬉しい。この際有料でもいい。[^2]
[^2]: なんと驚いたことにこれから紹介するものは無料ですが

そんなものがね。

**[あるんすよ・・・。(Google Codelabs)](https://codelabs.developers.google.com/)**

### AndroidのCodelabs
さて、早速先のリンクにアクセスされた方は、
大量に並んだ「見覚えのあるアイコンとよくわからん英文」を目にしたかと思います。

そのアイコン群の中にありますね。Androidも。ドロイド君が。**コイツらを端からやってきゃあいいんですよ。**

・・・というのはちょっとマッチョですが、まあ間違いではありません。
今回はさらに優しくオススメするものがあります。

さて、Google Codelabs内のカテゴリは、先ほど見たドロイド君のアイコンに当たる技術区分[^3]だけではありません。
[^3]: そう呼ぶことにしました
多くは過去のイベント(Android Dev Summitとか)で発表された内容なので、技術区分と並行して、イベント区分[^4]が存在します。
[^4]: 上に同じ

このイベント区分、よくよく見ると、少し異なるものがあります。なんと**学習コースとして組み立てられたもの**が存在します。
しかもいつも**だいたい数ヶ月内に更新**されています。

今回はソレについて喋ります。
**[Google Codelabs Android Kotlin Fundamentals Course](https://codelabs.developers.google.com/android-kotlin-fundamentals/)**

## Android Kotlin Fundamentals Course

### 身につくもの
だいたい[Android Architecture Components](https://developer.android.com/topic/libraries/architecture/)を学んでいくものと思ってよいかと思います。
https://developer.android.com/jetpack の「アーキテクチャ」の項目に沿って、紹介していきましょう。

先に言ってしまうと**絶対にはじめからから順番にやった方がいい**ので、
それぞれ項目別にCodelabsのリンクを添えてはいるものの、**これは最後の最後まで腰が重い人用**みたいなモンです。

#### Data Binding
Codelabs : [Android Kotlin Fundamentals 02.4: Data-binding basics](https://codelabs.developers.google.com/codelabs/kotlin-android-training-data-binding-basics/)
みんな大好きなやつです。レイアウト定義側に「この場所にはこの値を表示してな」と指定するようなやつです。

Android的には、XMLファイルに変数を記述するような形になります。
テキスト類が一番イメージしやすいですが、「変数の値がTrueの時表示、Falseの時非表示」というような使い方も可能です。
クリックリスナーなんかも指定できます。あと双方向bindingもあります。ユーザー入力がデータにすぐ反映されるやつ。

概念的な構成の概要だけ話しておくと、

1. XMLファイル内で型とともに変数を宣言
2. その変数を使ってXMLファイル内の表示内容を指定
3. 処理側ではXMLファイルに対応したBindingオブジェクトから変数の値を代入

という感じです。
これの味をシメると、レイアウトはとりあえず`<layout><data></data></layout>`[^5]を書くようになります。なりましょう。
[^5]: DataBindingライブラリによって、<layout>要素から始まるXMLファイルはBindingクラスが自動生成されるようになります。

そういえば、冒頭の「`findViewById`の根絶方法」の一つに当たります。Bindingオブジェクトから各View要素にアクセス可能です。

#### Lifecycle
Codelabs : [Android Kotlin Fundamentals 04.1: Lifecycles and logging](https://codelabs.developers.google.com/codelabs/kotlin-android-training-lifecycles-logging/)
これはあまり「このライブラリを使って出来ることがあってな」という話ではないやつです。
（クラスとしては、たぶんテストの時に使うくらい・・・？かと思っています）

とはいえ単語としては「Android開発の肝」と呼ばれるブツでありまして、
ライフサイクルという概念自体は何よりも重要です。君がクラスを直接使わずともLiveDataはLifecycleを使っている。
他のものを使うために必要な知識、という存在ですね。「初心者です」と言っても基本の図くらいは知っておきましょう。

#### LiveData
Codelabs : [Android Kotlin Fundamentals 05.2: LiveData and LiveData observers](https://codelabs.developers.google.com/codelabs/kotlin-android-training-live-data/)
DataBindingがヤバくなるやつです。あとRoom。[^6]
[^6]: RoomからLiveData<>返すやつの便利さはマジでヤバいので是非体験して頂きたい。

存在としては「持ってる値の変更を監視してるクラス」です。
変更時に走る処理を登録できて、たとえばそこに画面テキストの更新を入れておいたりしたらハッピーになるわけです。
そしてAndroidにおいては、XMLにLiveDataを直接書いておくと**画面更新まで自動でやってくれちゃう**とかいうヤバいアハ体験ができます。
上のリンクからさっさと使ってみましょう。

```kotlin
    private val _piyo = MutableLiveData<Boolean>()
    val piyo: LiveData<Status>
        get() = _piyo
```
自分はこの宣言のしかたをメチャクチャ守って開発をしています。

#### Navigation
Codelabs : [Android Kotlin Fundamentals 03.2: Define navigation paths](https://codelabs.developers.google.com/codelabs/kotlin-android-training-add-navigation/)
アプリ内の画面(Fragment)遷移を管理するやつです。
あとAndroid特有の左側にシュっとなるメニューとか画面上についてるボタンとかをメッチャ簡単に実装できます。

編集がほとんどGUI上で出来るのもヤバいところで、遷移の時に固定で行う処理を定義したりも出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261080/4719d96a-3092-73ac-59c6-b84e04d23ad4.png)
AndroidStudio君、こんな顔もできるんですよ。僕はもうビビり散らかしましたね。

#### Paging
Codelabs : [Android Paging](https://codelabs.developers.google.com/codelabs/android-paging/)
（リンク先ページ名のとおり、実はこれだけFundamentals Courseにはありませんでした）

無限スクロールとかを実装するときに、流暢なデータ読み込みを実現するやつです。
loadInitial,loadBefore,loadAfterの窓口を持つDataSourceクラスを使ってデータの読み込み方を定義して、
RecyclerViewにPagedListAdapterというアダプタをアタッチして実装します。

ページの判別方法によってDataSourceに種類があるのと、
よく見つかるサンプルがWebリソース->ローカルキャッシュ->DataSource<PagedList<T>>の形なことが多いのでそれ以外の実装方法をしようとすると悩むことになりがちですが、
DataSourceだけ定義したらもうゴールが見えているくらいにPagingとしての実装ボリュームは少なくて住むものです。

#### Room
Codelabs : [Android Kotlin Fundamentals 06.1: Create a Room database](https://codelabs.developers.google.com/codelabs/kotlin-android-training-room-database/)
アプリ内Database(SQLite)をラップするライブラリです。これまた大変使いやすいです。

自分は普段仕事で素のSQLiteとも戦っていますが（※記事作成当時）、使っている時の安心感から何から段違いですね。

定義するのは

1. テーブル情報になるEntityデータ
2. そのテーブルに対するクエリを持つDao(DataAccessObject)
3. データベースオブジェクト

の3つです。
Entityはデータクラス置いといたらいいし、
Daoは呼びたいクエリごとに関数として窓口を用意する形で超わかりやすいし、
Database本体はDao紐付けたらいいだけです。

#### ViewModel
Codelabs : [Android Kotlin Fundamentals 05.1: ViewModel and ViewModelFactory](https://codelabs.developers.google.com/codelabs/kotlin-android-training-view-model/)
画面(Activity,Fragment)が持ってる値を保持してくれるやつです。

要はActivityがライフサイクル的に死んでもこいつは生きててくれるという話なんですが、
これに関しては[公式](https://developer.android.com/topic/libraries/architecture/viewmodel)の画像がメチャクチャわかりやすくこのクラスのありがたさを表しているので貼っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261080/95e41e08-391f-4946-5f76-604c94c7d2ed.png)
このシンプルさよ。（図中右）

#### WorkManager
Codelabs : [Android Kotlin Fundamentals 09.2: WorkManager](https://codelabs.developers.google.com/codelabs/kotlin-android-training-work-manager/)
バックグラウンドの処理を管理するやつです。
バックグラウンドなので当然見た目が嬉しくなるものとかではないですが、メッチャ簡単に定期処理とかを実装できます。
識別子を定義しておいて、タスクの重複なんかもしないようにいい感じにやってくれる他、
そもそものリソースの使われ方なんかも「こいつに任せといたらおｋ」となるので使い得です。

## おまけ情報

### リポジトリ
コースで使うコードはすべて[単一のGithubリポジトリ](https://github.com/google-developer-training/android-kotlin-fundamentals-apps)にまとまっています。親切。

### 英語のおとも
[Mouse Dictionary](https://chrome.google.com/webstore/detail/mouse-dictionary/dnclbikcihnpjohihfcmmldgkjnebgnj)
みんな大好き~~魔王物語物語のwtetsuさんによる~~英単語一瞬で引けるマシーン。

[Google 翻訳(Chrome拡張)](https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb?hl=ja)
Codelabs中の英文は簡単に短めになっているので、文章単位でページ遷移無く翻訳できがち。

[Read Aloud(自動読み上げ)](https://chrome.google.com/webstore/detail/read-aloud-a-text-to-spee/hdhinadidafjejdhmfkjgnolgimiaplp)
正直Codelabsではあまり使えていないんですが、メッチャいいです。

### (ひとり開発AdventCalendarは)「ひとりぼっちで開発しているものを発表していくカレンダーです。」
「すみませんリリース間に合いませんでした・・・」

## 翌日は
@gayou さんの「mecab-koで簡易的なルールベースの韓日機械翻訳を作っている話」です。よろしくおねがいします！