現役AndroidエンジニアがAndroid Kotlin Fundamentalsコードラボに挑戦！その１

# はじめに
約2年半前AndroidStudioに初めて触れ、
勉強会で教えてもらいながら個人アプリ開発などを行ってきた。
本業でAndroidエンジニアなったのはここ1年足らずなのだが、
Android開発楽しい！と思う反面、分からないことが多く悔しいぃぃとなることも多い...。
KotlinやAndroid開発のことをもっと理解したい！！ということで
Googleさん公式基礎トレーニングの
Android Kotlin Fundamentalsコードラボに挑戦！！

https://developer.android.com/courses/kotlin-android-fundamentals/overview


# Lesson 1: Build your first app
##01.0: Install Android Studio
https://developer.android.com/codelabs/kotlin-android-training-install-studio?index=..%2F..android-kotlin-fundamentals#0
### 内容
- AndroidStudioのインストール

## 01.1: Get started
https://developer.android.com/codelabs/kotlin-android-training-get-started#0


### 内容
- AndroidManifest.xmlやGradle Scriptsなど自動で作成されるフォルダの解説
- 仮想デバイス(エミュレータ)でアプリを実行
- 物理デバイスでアプリを実行
- 「HelloWorld」を「HappyBirthdayto〜」に変更
- 宿題：app_nameを変更

　　　<img width="30%" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/c0ef876a-2059-3c50-7968-1230d197d6f7.png>　　　<img width="30%" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/d78ced60-4549-bc31-bb6c-932534f31361.png>

### メモ
- 常に仮想デバイスと物理デバイスの両方でテストするのが推奨されている

##01.2: Anatomy of Basic Android Project
https://developer.android.com/codelabs/kotlin-android-training-app-anatomy#0

### 内容
- 自動で作成されるActivityの解説
- xmlの解説　(LinearLayout)
- サイコロアプリの作成
  - Buttonの追加 
  - 文字列リソースの抽出
  - indViewById()の使用
  - setOnClickListener()の使用
  - Toastの使用
  - .textで文字列の変更
  - 乱数の取得
- コーディングチャレンジ：カウントアップボタンの追加
- 宿題:リセットボタンの追加

　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/8c8badcc-f487-a073-e0eb-26c55651e193.png>　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/179bcdc6-62a7-d506-b94c-137e7fb4f6a4.png>
　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/ee76da01-e7a7-5f86-87a4-15b3072e3faf.png>　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/e218ea6f-1eb3-68f3-87eb-9ea868a0ee9b.png>

### メモ
- 文字列リソースの抽出
  - 文字列を選択して　Option+Enter → Extract string resource
- 1~6の乱数取得 
  - (1..6).random() 
- メンバ変数の宣言だけを行いたいときは lateinit var を使う

## 01.3: Image resources and compatibility
https://developer.android.com/codelabs/kotlin-android-training-images-compat#0

### 内容
- 画像が表示されるサイコロアプリの作成
  - drawableに画像を配置
  - ImageViewの追加
  - 数字と画像を紐づける
  - findViewById()する場所を変更して効率を良くする
  - デフォルト画像の設定
  - toolsでプレビュー画像を設定
- APIレベルの解説
- サポートライブラリの解説
- コードチャレンジ：サイコロを2つにする
- 宿題：クリアボタンの追加

　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/9ae94d13-9d82-9fc0-07ac-8cd12f7bdf46.png>　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/bd5be51d-33c2-35dc-24f7-bcd1e59d666b.png>
　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/882221d8-bfc7-e64f-7c16-46034bceb115.png>　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/b94c0b69-a918-abac-807d-9e597757f402.png>

### メモ
- when文の書き方

```
val drawableResource = when (randomInt) {
            1 -> R.drawable.dice_1
            2 -> R.drawable.dice_2
            3 -> R.drawable.dice_3
            4 -> R.drawable.dice_4
            5 -> R.drawable.dice_5
            else -> R.drawable.dice_6
        }
```
- findViewById()は、Androidシステムがビュー階層全体を検索するためコストのかかる操作 = 重い！
 - ボタンをタップするたびにfindViewById()せずに、メンバ変数に書こう 
- ベクター画像は拡大縮小できる上、PNG画像よりも軽い = アプリファイルが小さくなる

## 01.4: Learn to help yourself
https://developer.android.com/codelabs/kotlin-android-training-available-resources#0

### 内容
- Basic Activityの解説
- Basic Activityをカスタマイズ
- Activityの追加
- サンプルアプリの解説
- ランチャーアイコンの変更
- 参考になるサイトの紹介

　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/f7173a5e-5d08-fcf0-27ed-0aedea9dd7e8.png>　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/3d383472-1f6b-cb3b-5ebe-9092f0a35257.png>
　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/c48eacc1-5fec-167d-97a4-c9c369b77e38.png>　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/c88ae81c-15ee-57ab-5d41-a67c13b113e3.png>
　　　<img width="30%"src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/90b76058-99d6-a944-4118-9fdd5a585a6b.png>


### メモ
- https://github.com/android
  - 参考になるサンプルアプリがたくさんある
  - READMEを読むと概要が分かる
- https://developer.android.com/index.html
  - 公式Android開発者向けドキュメント
  - 常に最新 
- https://developer.android.com/design/
  - 高品質なデザインを設計するためのガイドライン
- https://material.io/
  - マテリアルデザインに関するサイト
- https://developer.android.com/docs/
  - API情報、リファレンスドキュメント、チュートリアル、ツールガイド、およびコードサンプルを見つけることができる
- https://developer.android.com/distribute/ 
  - アプリ公開に関する情報
- https://www.youtube.com/user/androiddevelopers
  - Androidデベロッパー公式のyoutubeチャンネル 
- https://blog.google/products/android/
  - Androidデベロッパー公式のブログ
- https://stackoverflow.com/
  - プログラマーが互いに助け合うコミュニティサイト

### 感想
経験者向けだと思って身構えていたが、Android開発未経験の人でも取り組めそうな内容だった！
ただ、コーディングチャレンジや宿題は考えて作る必要があり結構難しかった。
また、公式の情報が載っているサイトは思ったよりたくさんあることを知った！使い分けながら活用していきたい！
これは自業自得だが、英語が苦手なので日本語に自動翻訳しながら読み進めたため、ところどころ文章がおかしくて読みにくかった...。
全体を通して思ったよりも時間がかかり、いつ終わるんだろう...と気が遠くなったこともあったが新しい発見があったりアプリがどんどんできていったりと楽しかった！!
次章も楽しみ！！

かかった時間：約7時間半
※AndroidStudioやエミュレータはもともと入っていたのでインストールやダウンロードの時間は含まない