事業部有志でアプリ開発なのだが、私もKotlinを覚えて参加したいのだ(。- .•)
入門を見ながら頑張ります。
- Kotlin対応版
- ハンズオンでたくさんサンプルアプリが作れる
この2つの理由で選びました。良い本です。
もくじ
対象読者
- 私
演習しながらのメモ帳です。
気になったら本を買ってみてください、わかりやすくておすすめです。このメモでは私がひっかかったところとか、大事だなってポイントをメモしているものです。
Android Studioのエミュレータ凄いね!
まだKotlinを打てていないのに環境構築だけで眠たくなってきた。。簡単なスケジュール管理アプリでも作れたら今日は寝たい😌💤 pic.twitter.com/6AVgQ9HvTD
— 優さん@個人開発 (@yuu13n6) September 30, 2019
まずは開発環境をゲットするのだ
インストール完了
なかなか格好よろしいな。
端末設定
上記のアイコンの【AVD Manager】を選択します。
【Create Virtual Device】をクリックします。
私のXperiaなんてものがあるわけもなく、【Nexus 5】を選択するのだった。
PieのDownloadをクリックして、SDKのダウンロードが終わってから、【Next】をクリックします。
チェックボックスを空にして、【Finish】をクリックします。
再生ボタンを押します。
画面が現れたら、上にスワイプします。
言語設定
【Setting】をクリックします。
【System】を選択
【Languages & input】を選択
【Add a language】をクリックします。
最下部付近にある【日本語】を選択します。
【日本語(日本)】のハンバーガーマークをドラッグして上にもっていきます。優先度があがるのです。
こんな感じ!
【仮装キーボード】をクリックします。
【言語】を選択して、
【キーボードを追加】をします。
【日本語】をクリックします。
【完了】をクリックします。
日付と時刻で、『GMT+09:00 日本標準時』になっていることを確認して、■をクリックします。
日本語化されました。
Hello World! ビルドしてみよう
【ビルド】ボタンを押します。
ビルドされてHello World!が表示されました。
だいたいわかってきましたね。
これからエディタでGUIで画面設計しつつ、細かい部分でKotlinをしこしこと紡いでいく作業に入ります。
開発の流れ
- プロジェクトの作成
- res/layoutフォルダのlayout.xml
画面構成を設計 - javaフォルダの.ktファイル
アクティビティなどを .ktファイルに処理を記述 - res/valuesフォルダのstrings.xml
表示文字列をきじゅつ - アプリをビルドして動作確認する
単位
- 解像度がスマホによって異なるので開発でpxは使用しない。
- dp, spを利用します。
2つのファイルとGUIのデザインモードを利用してしあげる。
- res/valuesフォルダのstrings.xml
- res/layoutフォルダのlayout.xml
Visual Studioライクですね。
WEBのHTML的なのは終わり。
次はイベントへ!
リソース管理のRクラス
java/com.example.viewsample/MainActivity.kt
package com.example.viewsample import androidx.appcompat.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
このRをR値と呼ぶ。
setContentView(R.layout.activity_main)
イベントとリスナ
オーバーライド
- 親クラスを継承した時に子クラスで定義し直すことをオーバーライド
- Kotlinでは定義し直すメソッドに対して、overrideをつける必要がある
MainActivity
findViewById<EditText>(R.id.etName)
activity_main.xml
<EditText android:id="@+id/etName"
etNameという名前で対応している
valとvar
- val 読み込み専用。Getter
- var 読み書き可能。Getter, Setter
import
インターフェイスとかオブジェクトをimportしたい時
- 文字をドラッグで選択状態にする
- Option+Enterを押す
- セレクターが現れるのでImportを選択する
P112
val adapter = ArrayAdapter(applicationContext, android.R.layout.simple_list_item_1, menuList)
android.R.layout.simple_list_item_1
android.RはR値が記述されたクラス。このクラスをimportすると、独自のRクラスが読み込まれなくなるので、importしてはいけない。
ダイアログ
ダイアログ生成クラスを作成する必要があります。
コンストレイント
P129
ビジュアルモードでTextviewを選択して、右のLayoutを押すとGUIでマージンなどを操作できる。
- Designモードで、入力用のフィールドをラベルに所属させてあげる。
- Plain Text, Email, Multipleなど使い分ける。
- etNameの上ハンドルをetTitleの下に連結
- etNameの左ハンドルをtvNameの右に連結
これで横並びにできます。
ガイドライン
メニューからAdd Vertical Guidelineを選択します。
ボタンのチェイン化
- コンストレイントで横を繋げる
- 3つのボタンを選択した状態右クリック
- Create Horizontal Chainを選択する
ボタンの均等配置
Chainでグループになっているボタンの、1つだけを選択して右クリックし、【Cycle Chain mode】をクリックします。
すると均等配置になります。
画面遷移
MainActivity.kt
package com.example.intentsample import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.ListView import android.widget.SimpleAdapter class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 画面商品ListViewを取得 val lvMenu = findViewById<ListView>(R.id.lvMenu) // SimpleAdapterで使用するMutableListオブジェクトを用意 val menuList: MutableList<MutableMap<String, String>> = mutableListOf() // 『唐揚げ定食』のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録 var menu = mutableMapOf("name" to "唐揚げ定食", "price" to "800円") menuList.add(menu) //「ハンバーグ定食」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録。 menu = mutableMapOf("name" to "ハンバーグ定食", "price" to "850円") menuList.add(menu) menu = mutableMapOf("name" to "生姜焼き定食", "price" to "850円") menuList.add(menu) menu = mutableMapOf("name" to "ステーキ定食", "price" to "1000円") menuList.add(menu) menu = mutableMapOf("name" to "野菜炒め定食", "price" to "750円") menuList.add(menu) menu = mutableMapOf("name" to "とんかつ定食", "price" to "900円") menuList.add(menu) menu = mutableMapOf("name" to "ミンチかつ定食", "price" to "850円") menuList.add(menu) menu = mutableMapOf("name" to "チキンカツ定食", "price" to "900円") menuList.add(menu) menu = mutableMapOf("name" to "コロッケ定食", "price" to "850円") menuList.add(menu) menu = mutableMapOf("name" to "焼き魚定食", "price" to "850円") menuList.add(menu) menu = mutableMapOf("name" to "焼肉定食", "price" to "950円") menuList.add(menu) // SimpleAdapter第4引数from用データの用意 val from = arrayOf("name", "price") // SimpleAdapter第5引数to用データの用意 val to = intArrayOf(android.R.id.text1, android.R.id.text2) // SimpleAdapterを生成 val adapter = SimpleAdapter(applicationContext, menuList, android.R.layout.simple_expandable_list_item_2, from, to) // アダプタの登録 lvMenu.adapter = adapter } }
それぞれ対応している
val from = arrayOf("name", "price") // SimpleAdapter第5引数to用データの用意 val to = intArrayOf(android.R.id.text1, android.R.id.text2)
画面遷移のコードと新画面のコードを記述する
Unchecked cast: Any! to MutableMap<String, String>の回避
@Suppress("UNCHECKED_CAST") ←●追加 val item = parent.getItemAtPosition(position) as MutableMap<String, String>
きっとこれは良くない、良くないが。。良くないが。。
P169
誤植?
本のサンプルコードで動かず。
WEBのサンプルコードと異なっていたが差し替えたら動いた。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { Log.i("LifeCycleSample", "Main onCreate() called.") super.onCreate(savedInstanceState) - setContentView(R.layout.activity_life_cycle_main) + setContentView(R.layout.activity_main) }
class SubActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { Log.i("LifeCycleSample", "Sub onCreate() called.") super.onCreate(savedInstanceState) - setContentView(R.layout.activity_life_cycle_sub) + setContentView(R.layout.activity_sub) }
Logcat
[amazon_link asins=’479816044X’ template=’ProductCarousel’ store=’izayoi55-22′ marketplace=’JP’ link_id=’4a1c1497-c7fb-4e12-bcf1-f687e5dc31d3′]