掌田 津耶乃著『Android Jetpack プログラミング』の歩き方(Section3-1)


1. はじめに

 掌田 津耶乃著『Android Jetpack プログラミング』(以下、本書と言う)で勉強しています。この本は、著者が記述しているように入門書ではないようです。それゆえ、本書をしっかりと読み込んでいないと、記載されているソースコード通りに写経しても、エラーで弾かれることがあります。本レポートでは、「『Android Jetpack プログラミング』の歩き方」と題して、ソースコードどうりに写経してアプリが正常に動くようにするための注意点をレポートします。記述や考え方などに誤りがあれば、ぜひご教示いただきたいと思います。

2.本書が求めている動作環境の条件

 本書が要求している動作環境の条件は、AndroidStudio4.0です。一方で2021年5月現在の最新のAndroidStudioは、バージョンは4.1.3(for Windows 64-bit)です。バージョン4.0と4.1の違いのひとつに、Kotlin-Android-Extensionsがデフォルトでは使えなくなり、ViewBindingの使用を推奨し始めたことです。Kotlin-Android-Extensionsについては本書p61に、またViewBindingについては本書p57に記述されています。

3.本記事を記述した際の動作環境の紹介

 私がこの記事を書いた際の動作環境は次のとおりです(AndroidStuidoのHelpメニューのAboutからコピーしました)。

Android Studio 4.1.3
Build #AI-201.8743.12.41.7199119, built on March 11, 2021
Runtime version: 1.8.0_242-release-1644-b01 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 1237M
Cores: 8
Registry: documentation.show.toolbar=true, ide.new.welcome.screen.force=true, external.system.auto.import.disabled=true
Non-Bundled Plugins: org.jetbrains.kotlin

4.本書のソースコードが動くようにするために

 本書の第3章のSection3-1(p142以降)に記述されているソースコードが動くようにするために、以下の部分を変更しました。なお、本書の著作権に配慮して、変更や追記した部分のみを記述します。また途中、変更を加えていない部分は“// ・・・”と記述したり、或いは何らかの方法で隠します。

4.1 リスト3-3 MainActivityクラスで生じる不具合

 本書p146リスト3-3のMainActivityクラスを写経すると次の図の部分でエラーを生じると思います。これは、このプロジェクト(このソースコード)がKotlin-Android-Extensions(以下、KAE)を利用しているためです。(これは、import kotlinx.android.synthetic.main.activity_main.*の部分で読み取れます。当初MainActivity以下のソースコードをまじめに手打ちしていて、import文はAndroidStudioの言うとおりインポートしていたので、このKAEのためのクラスをインポートをせずにいました。そのためエラーの原因がわからず、とりあえずfindViewByIdを利用していました。それが//でコメントアウトした部分です。この記事を書いている際にこのKAEのためのインポート文が不足していることに気づき、本書のリストどおりに動かない本当の原因がわかりました。)

 さてこのimport文を追記しただけでは、KAEは機能しません。KAEを機能させるためには、本書p61のリスト1-13のとおりbuild.gradle(Module:app)ファイルのプラグインに追記が必要になります。但しAndroidStudio4.1のbuild.gradleの記述方法が変更されたようで、次のように記述しました。

// build.gradle(Module:app)
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'    // 追記
}

// ・・・

 build.gradleを変更したら、忘れずにAndroidStuidのエディタ右上の「SyncNow」をクリックしましょう。

 ちなみに本書には、リスト3-3のMainActivityクラスに対応するレイアウトファイル(activity_main.xml)が記述がなかったので、以下に記述しました。

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="228dp"
        android:text="Hello World!"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/text1"
        app:layout_constraintVertical_bias="0.346" />

</androidx.constraintlayout.widget.ConstraintLayout>

4.2 リスト3-6 MainActivityクラスで気付いたこと

 もしも、本書p152の「ビューモデルを使わないと?」の項目を別のプロジェクトを作って確認しようとするならば、第4.1項と同様にbuild.gradle(Module:app)ファイルに追記の処置が必要になります。

 蛇足ですが、リスト3-6にあるfun to_s(ob:Person)メソッドの行ですが、なぜここに記述されているのでしょうか??fun updateData()メソッドの中で、item.to_s()を呼んでいますが、これはPersonクラスのオブジェクト不随しているメソッドを呼んでいるので、リスト3-6にあるfun to_s(ob:Person)メソッドの行は不要ではないでしょうか?(今のところ、ここに有っても害はなさそうですが、、、後で使うのかな?)

5.終わりに

 本書はAmazonのブックレビューにもあるように、現在発売されているAndroidプログラミングの教科書の中では、少しレベルの高い内容になっていると思います。(金田著「はじめてのAndroidプログラミング」、斎藤著「Androidアプリ開発の教科書」、山田著「Androidアプリ開発」などより、レベルが高いと思います。)それだけに私のような初心者では、ソースコードの行間に書かれた意味(エラーが起きた時の対処方法)が解からないのが悔しくてなりません。(発売当初すぐに、生きこんで本書を購入しましたが、第2章のComposeで躓き、6ケ月以上書棚に寝かせていました。最近、ViewModelについて知りたくなり、また本棚より引っ張り出してきました。またComposeについては、折を見て改めて勉強したいと思います。どうもComposeは進化の途中のようですね。どなたか本書のConposeの項目をクリアした方がいたら、ぜひどのようにすれば動くようになるかレポートしていただければありがたいです。--->ここにありました。さすがQitta!勝手にリンクします。)
 今後引き続き、本書を写経するにあたり、気づいた点をレポートしたいと思います。

以上、